Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步/等待模拟_Javascript_Async Await_Ecmascript 2017 - Fatal编程技术网

Javascript 异步/等待模拟

Javascript 异步/等待模拟,javascript,async-await,ecmascript-2017,Javascript,Async Await,Ecmascript 2017,我想知道在测试中是否可以使用async/await做类似的事情 例如,通过常规承诺,我可以在单元测试中模拟这样的承诺 class Foo { fn() { this.someService.someFn().then((data) => this.data = data); } } describe("something", function() { beforeEach(function() { this.instance = n

我想知道在测试中是否可以使用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() {

        }
    }
}
我在beforeach中所做的覆盖将不再有效。 所以我这里的问题是…我可以做一些类似于用异步/等待代码样式覆盖承诺的事情吗


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

首先,您的旧mock应该可以很好地使用
async
/
wait
。不过,最好使用
Promise.resolve
而不是使用
返回对象。然后使用
方法:

someFn: () => Promise.resolve('fake data')
但是,由于您已经在使用
async
/
await
,您也可以在测试中利用它:

someFn: async () => 'fake data'