如何在 Angular 8 单元测试中读取文本文件

问题描述 投票:0回答:2

我已经编写了一个 Angular 8 应用程序并计划编写单元测试。特别是我需要测试我开发的文件解析器。

如何从单元测试中读取文本文件(我的黄金模型)?

angular jasmine
2个回答
3
投票

假设:

  • 您将JasmineKarma一起使用。
  • 要测试的方法是
    KicadReader#read(url: string, dataHandler: DataHandler)
    DataHandler
    是一些自定义的
    interface
    class
  • 您的测试文件是
    src/app/shared/services/reader/kicad/test.sch

这可以通过

XMLHttpRequest
完成,如下所示:

it('#read should supply Kicad file content', (done) => {

    // given
    const filePath = 'src/app/shared/services/reader/kicad/test.sch';
    const request: XMLHttpRequest = createRequest(filePath );

    request.onload = r => {
        const url = URL.createObjectURL(new Blob([request.response]));

        // when
        kicadReader.read(url, dataHandler);
    };

    dataHandler.onData = data => {

        // then
        expect(data).toBe('expected data');
        done();
    };

    // trigger
    request.send(null);
});

function createRequest(filePath: string): XMLHttpRequest {
    const request = new XMLHttpRequest();
    request.open('GET', 'base/' + filePath, true);
    request.responseType = 'arraybuffer'; // maybe also 'text'
    return request;
};

为了完成此工作,需要告诉 Karma 提供测试文件(请参阅 http://karma-runner.github.io/4.0/config/files.html)。为此,请将以下内容添加到您的

karma.config.js

files: [
      { pattern: 'src/app/shared/services/reader/kicad/test.sch', included: false, watched: false, served: true }
]

0
投票

我编写单个函数,它返回一个字符串或 XML 或其他用于测试的内容,因此我不必从文件加载它们。

示例文件:remote-manifest-xml.ts:

export function getRemoteManifestXML() {
  return new DOMParser().parseFromString(`<XML-string like in the file>`, 'text/xml');
}

然后我可以设置我的间谍:

const parseFromStringSpy = spyOn((configService as any).domParser, 'parseFromString')
    .and.returnValue(getRemoteManifestXML());

如果你真的从文件中读取,并且文件将来发生更改,则文件更改后你的测试可能会失败。

使用函数,内容保持不变。

(在这种情况下,我的清单文件会不时更改版本号,并且应用程序会检查远程清单版本并在必要时自行更新 - 如果我要读取真实文件,我无法轻松控制其内容)

© www.soinside.com 2019 - 2024. All rights reserved.