4

我想知道是否可以在测试中使用 async/await 来做这样的事情。

例如,通过常规的承诺,我可以像这样在单元测试中模拟一个承诺。

class Foo {
    fn() {
        this.someService.someFn().then((data) => this.data = data);
    }
}

describe("something", function() {
    beforeEach(function() {
        this.instance = new Foo();

        // Can this part be mocked out with the same idea, when someService.someFn is async fn
        this.instance.someService = {
            someFn: function() {
                return {
                    then: function(cb) {
                        cb("fake data");
                    }
                }
            }
        }

        this.instance.fn();

    });

    it("a test", function() {
        expect(this.instance.data).toBe("fake data");
    });
});

(如果我覆盖了承诺,我就不必处理冲洗或类似的事情。)但是现在,当 fn() 将更改为此

class Foo {
    async fn() {
        try {
            this.data = await this.someService.somefn();
        } catch() {

        }
    }
}

我在 beforeEach 中所做的覆盖将不再起作用。所以我的问题是......我可以做一些类似于我用异步/等待代码风格覆盖承诺的事情吗?

这里的想法是我想模拟外部依赖项我正在单元测试的函数可能使用什么,比如“someService”。在那个特定的单元测试中,我希望 someService.someFn 能够正常工作,并且我可以模拟它的响应。其他测试检查“someFn”的有效性。

4

1 回答 1

10

async首先,您的旧模拟应该与/完美配合await。不过,最好使用Promise.resolve而不是返回带有.then方法的对象:

someFn: () => Promise.resolve('fake data')

但是由于您已经在使用async/ await,您也可以在测试中利用它:

someFn: async () => 'fake data'
于 2016-01-21T13:08:05.987 回答