Проблемы с асинхронными тестами авы при заглушке синон

У меня есть пара тестов, которые я хотел бы запустить на блоках .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?


person sak_to    schedule 18.06.2016    source источник


Ответы (1)


Тесты AVA выполняются одновременно, что портит вашу заглушку Sinon.

Вместо этого объявите, что ваши тесты выполняются последовательно, и это должно работать:

test.serial('First async test', ...);
test.serial('Second async test', ...);
person robertklep    schedule 18.06.2016
comment
Чтобы предоставить больше информации об этом, да, по умолчанию тесты выполняются одновременно. Это означает, что хук beforeEach для всех тестов также запускается одновременно. Происходит то, что каждый вызов хука beforeEach заменяет переменную sandbox, поэтому оба теста фактически используют одну и ту же песочницу. Вы можете исправить это, назначив t.context в beforeEach, который также будет доступен в тесте. Однако оба теста по-прежнему изменяют одну и ту же зависимость в одно и то же время, поэтому второй тест все равно не сможет заглушить метод. Следовательно, вам нужно test.serial. - person Mark Wubben; 06.10.2016
comment
Спасибо за понимание, @MarkWubben :) - person robertklep; 06.10.2016