我需要在Angular中做一个测试规范,检查base64字符串是否被转换为Blob对象。转换过程涉及到嵌套的promises:
fetch(testImage1).then(res => res.blob()).then(blob => {});我使用这个规范测试这个过程:
it( 'should update an image fakeAsync', fakeAsync( () => {
fixture.detectChanges();
let imgBlob = null;
// testImage1 = 'data:image/gif;base64,R0lGODlhPQBEAPeoAJosM//AwO/AwHVYZ/z5......'
fetch(testImage1).then(res => res.blob()).then(blob => {
imgBlob = blob;
expect(imgBlob).toBeTruthy(); //OK
});
tick();
expect(imgBlob).toBeTruthy(); //test fails
} ));如代码所示,spec在fakeAsync块中运行,并且在异步代码调用之后调用tick()方法。imgBlob应该在tick()阻塞函数释放程序流之后设置。但是程序流不会停止,而是在异步调用结束之前检查第二个期望。这会导致规范失败。
Angular CLI 6.2.6、Karma 3.1.1、Jasmine 2.8.0
作为一种解决方法,这是可行的:
let promise = new Promise((resolve, reject) => {
fetch(testImage1).then(res => res.blob()).then(blob => {
resolve(blob);
});
});
imgBlob = await promise;发布于 2020-10-28 00:59:31
两件事:
首先,@dmcgrandle是正确的,fakeAsync依赖于猴子修补异步内置方法(或者更确切地说,它依赖于Zone.js修补它们),并且它明确地不支持网络请求。至少,所有的文档都说您不能使用XHR,虽然我很惊讶地发现它也没有明确地说明您不能使用fetch,但这似乎是一个相当安全的赌注。他们不做一个允许对data: URL的fetch进行不同处理的例外也就不足为奇了。即使它实际上没有触发网络活动,它仍然使用Promises异步运行。
其次,我不确定你的真实代码是什么样子的,但你写的测试基本上是检查基本的浏览器功能(或者你的polyfill?)工作正常。如果您实际上只需要从一些静态数据中创建一个Blob,那么有一些更简单的方法可以在不调用fetch的情况下实现这一点。
https://stackoverflow.com/questions/53503585
复制相似问题