我已经编写了一个 Angular 8 应用程序并计划编写单元测试。特别是我需要测试我开发的文件解析器。
如何从单元测试中读取文本文件(我的黄金模型)?
假设:
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 }
]
我编写单个函数,它返回一个字符串或 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());
如果你真的从文件中读取,并且文件将来发生更改,则文件更改后你的测试可能会失败。
使用函数,内容保持不变。
(在这种情况下,我的清单文件会不时更改版本号,并且应用程序会检查远程清单版本并在必要时自行更新 - 如果我要读取真实文件,我无法轻松控制其内容)