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 で行った上書きは、もう機能しません。ここでの私の質問は... async/await コード スタイルを使用した promise の上書きで行ったようなことを行うことはできますか?

ここでのアイデアは、「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 に答える