2016-04-28 6 views
2

У меня есть некоторый код, который я пытаюсь проверить со структурой, как это (за Cleaning up sinon stubs easily):Как использовать синонные песочницы, когда тесты выполняются асинхронно?

function test1() { 
    // manually create and restore the sandbox 
    var sandbox; 
    beforeEach(function() { 
     sandbox = sinon.sandbox.create(); 
     sandbox.stub(globalVar, "method", function() { return 1; }); 
    }); 

    afterEach(function() { 
     sandbox.restore(); 
    }); 

    it('tests something', function(done) { 
     anAsyncMethod(function() { doSomething(); done(); }); 
    } 
} 

Там затем аналогичная test2() функцию.

Но если я:

describe('two tests', function() { 
    test1(); 
    test2(); 
} 

я получаю:

TypeError: Attempted to wrap method which is already wrapped 

Я сделал некоторые протоколирование, чтобы выяснить порядок выполнения и, кажется, что проблема в том, что он бежит test1 beforeEach() hook, затем test2 beforeEach() hook, затем test1 it() и т. д. Потому что он вызывает второй beforeEach(), прежде чем он доберется до afterEach() от первого теста, у нас есть проблема.

Есть ли лучший способ структурировать это?

ответ

1

Структура тестовой спецификации должно выглядеть примерно так:

describe("A spec (with setup and tear-down)", function() { 
    var sandbox; 

    beforeEach(function() { 
    sandbox = sinon.sandbox.create(); 
    sandbox.stub(globalVar, "method", function() { return 1; }); 
    }); 

    afterEach(function() { 
    sandbox.restore(); 
    }); 

    it("should test1", function() { 
    ... 
    }); 

    it("should test2", function() { 
    ... 
    }); 
}); 

Или вы могли бы сделать это:

function test1() { 
    ... 
} 

function test2() { 
    ... 
} 

describe("A spec (with setup and tear-down)", function() { 
    describe("test1", test1); 
    describe("test2", test2); 
}); 
+0

Но я хотел бы быть в состоянии поставить эти две функции в функции поэтому я могу использовать их для различных тестов. И я хотел бы, чтобы они были автономными, поэтому мне не нужно создавать песочницу и код заглушки каждый раз, когда я их вызываю. Разве это невозможно? –

+0

Я понимаю, что вы имеете в виду. Позвольте мне обновить свой ответ - новичок в форматировании кода в комментариях. –

+0

Дополнительная описательная оболочка - либо она у вас, либо только внутри каждой тестовой функции - делает это. Дополнительный уровень отчетности, но насколько это возможно, возможно. Благодарю. –