7

我有几个测试要在我的一个依赖项的.then.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

串行运行会减慢测试的运行速度。当然,您可以创建单独的变量 sandbox1 和 sandbox2 以防止第一个测试使用第二个测试中设置的沙箱。但是为了确保我不会犯这个错误,我所做的是在 IIFE(立即调用的函数表达式)中运行每个测试。一个 IIFE 中的任何变量都不同于另一个 IIFE 中的任何变量,即使它们具有相同的名称:

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