我有一些测试需要在一个依赖项的.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"
也许我没有理解如何设置我的测试。是否有一种方法可以强制测试A在开始运行之前完成,然后再运行测试B?
beforeEach
钩子也会同时运行。正在发生的是beforeEach
钩子的每个调用都会替换sandbox
变量,因此两个测试实际上使用的是同一个沙盒。您可以通过在beforeEach
中分配给t.context
来解决这个问题,这样它将在测试中可用。但是两个测试仍然在同时修改相同的依赖项,因此第二个测试仍将无法对该方法进行存根。因此,您需要使用test.serial
。 - Mark Wubben