Ich habe ein paar Tests, die ich auf den .then
und .catch
Blöcke einer meiner Abhängigkeiten ausführen möchte.Probleme mit ava asynchronen Tests beim Stubbing mit Sinon
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);
});
Wenn Sie beide Tests alleine ausführen, wird der Test bestanden. Aber wenn man diese zusammen ausführen, wird das Setup für den Test A, und dann vor es abgeschlossen ist, das Setup für Test B läuft und Sie erhalten diese Fehlermeldung:
Second async test
failed with "Attempted to wrap someMethod which is already wrapped"
Vielleicht verstehe ich nicht, wie ich sollte meine Tests einrichten. Gibt es eine Möglichkeit, Test A zu erzwingen, bevor Test B gestartet wird?
Das funktionierte. Vielen Dank! –
Um mehr Hintergrundinformationen dazu zu liefern, werden Tests standardmäßig gleichzeitig ausgeführt. Dies bedeutet, dass der 'beforeEach'-Hook für alle Tests gleichzeitig ausgeführt wird. Was passiert, ist, dass jeder Aufruf des 'beforeEach'-Hook die' sandbox'-Variable ersetzt, so dass beide Tests tatsächlich dieselbe Sandbox verwenden. Sie können das beheben, indem Sie 't.context' in' beforeEach' zuweisen, was auch im Test verfügbar sein wird. Beide Tests ändern jedoch immer noch die gleiche Abhängigkeit, so dass der zweite Test die Methode weiterhin nicht übersteuert. Daher brauchst du 'test.serial'. –
Danke für die Einsicht, @MarkWubben :) – robertklep