7

.then依存関係の 1 つのと.catchブロックで実行したいテストがいくつかあります。

import test from 'ava';
import sinon from 'sinon';

// Fake dependency code - this would be imported
const myDependency = {
    someMethod: () => {}
};

// Fake production code - this would be imported
function someCode() {
    return myDependency.someMethod()
        .then((response) => {
            return response;
        })
        .catch((error) => {
            throw error;
        });
}

// Test code

let sandbox;

test.beforeEach(() => {
    sandbox = sinon.sandbox.create();
});

test.afterEach.always(() => {
    sandbox.restore();
});

test('First async test', async (t) => {
    const fakeResponse = {};

    sandbox.stub(myDependency, 'someMethod')
        .returns(Promise.resolve(fakeResponse));

    const response = await someCode();

    t.is(response, fakeResponse);
});

test('Second async test', async (t) => {
    const fakeError = 'my fake error';

    sandbox.stub(myDependency, 'someMethod')
        .returns(Promise.reject(fakeError));

    const returnedError = await t.throws(someCode());

    t.is(returnedError, fakeError);
});

いずれかのテストを単独で実行すると、テストに合格します。しかし、これらを一緒に実行すると、テスト A のセットアップが実行され、それが完了する前にテスト B のセットアップが実行され、次のエラーが発生します。

Second async test
   failed with "Attempted to wrap someMethod which is already wrapped"

たぶん、テストの設定方法を理解していないのでしょう。テスト B の実行が開始される前に、テスト A を強制的に完了する方法はありますか?

4

2 に答える 2

14

AVA テストは同時に実行されるため、Sinon スタブが台無しになります。

代わりに、テストを連続して実行するように宣言すると、動作するはずです。

test.serial('First async test', ...);
test.serial('Second async test', ...);
于 2016-06-18T19:40:19.640 に答える
0

連続して実行すると、テストの実行が遅くなります。もちろん、最初のテストが 2 番目のテストでセットアップされたサンドボックスを使用しないように、別の変数 sandbox1 と sandbox2 を作成することもできます。しかし、この間違いを犯していないことを確認するために、各テストを IIFE (即時に呼び出される関数式) で実行する必要があります。ある IIFE の変数は、同じ名前であっても、別の IIFE の変数とは異なります。

(function () {
   ...one test
   });
(function () {
   ...anothertest
   });
于 2021-09-02T18:42:11.527 に答える