首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在嵌套的promise之后使用tick()不会导致等待promise完成(Karma/Jasmine)

在嵌套的promise之后使用tick()不会导致等待promise完成(Karma/Jasmine)
EN

Stack Overflow用户
提问于 2018-11-28 00:02:20
回答 1查看 243关注 0票数 4

我需要在Angular中做一个测试规范,检查base64字符串是否被转换为Blob对象。转换过程涉及到嵌套的promises:

代码语言:javascript
运行
复制
fetch(testImage1).then(res => res.blob()).then(blob => {});

我使用这个规范测试这个过程:

代码语言:javascript
运行
复制
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

作为一种解决方法,这是可行的:

代码语言:javascript
运行
复制
let promise = new Promise((resolve, reject) => {
        fetch(testImage1).then(res => res.blob()).then(blob => {
            resolve(blob);
        });

    });
    imgBlob = await promise;
EN

Stack Overflow用户

发布于 2020-10-28 00:59:31

两件事:

首先,@dmcgrandle是正确的,fakeAsync依赖于猴子修补异步内置方法(或者更确切地说,它依赖于Zone.js修补它们),并且它明确地不支持网络请求。至少,所有的文档都说您不能使用XHR,虽然我很惊讶地发现它也没有明确地说明您不能使用fetch,但这似乎是一个相当安全的赌注。他们不做一个允许对data: URL的fetch进行不同处理的例外也就不足为奇了。即使它实际上没有触发网络活动,它仍然使用Promises异步运行。

其次,我不确定你的真实代码是什么样子的,但你写的测试基本上是检查基本的浏览器功能(或者你的polyfill?)工作正常。如果您实际上只需要从一些静态数据中创建一个Blob,那么有一些更简单的方法可以在不调用fetch的情况下实现这一点。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53503585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档