2016-06-18 16 views
3

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?

Antwort

8

AVA-Tests werden gleichzeitig ausgeführt, wodurch Ihr Sinon-Stubbing durcheinander gerät.

Stattdessen erklären die Tests ausgeführt werden serially und es sollte funktionieren:

test.serial('First async test', ...); 
test.serial('Second async test', ...); 
+0

Das funktionierte. Vielen Dank! –

+8

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'. –

+0

Danke für die Einsicht, @MarkWubben :) – robertklep