Легко чистити заглушки синона


135

Чи є спосіб легко скинути всі глубокі шпигунські шпигуни та заглушки, які будуть працювати чітко з блоками mocha's перед кожним

Я бачу, що пісочниця - це варіант, але я не бачу, як можна використовувати для цього пісочницю

beforeEach ->
  sinon.stub some, 'method'
  sinon.stub some, 'mother'

afterEach ->
  # I want to avoid these lines
  some.method.restore()
  some.other.restore()

it 'should call a some method and not other', ->
  some.method()
  assert.called some.method

Відповіді:


304

Sinon забезпечує цю функціональність за допомогою пісочниць , які можна використовувати двома способами:

// manually create and restore the sandbox
var sandbox;
beforeEach(function () {
    sandbox = sinon.sandbox.create();
});

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

it('should restore all mocks stubs and spies between tests', function() {
    sandbox.stub(some, 'method'); // note the use of "sandbox"
}

або

// wrap your test function in sinon.test()
it("should automatically restore all mocks stubs and spies", sinon.test(function() {
    this.stub(some, 'method'); // note the use of "this"
}));

6
@CamJackson Коли у вас є тести на асинхронізацію, вам потрібно скористатись першим методом, інакше sinon очистить заглушки до того, як ваш тест завершиться.
keithjgrant

3
Якщо ви використовуєте sinon> 5.0, прочитайте нижче. Там зараз набагато простіший спосіб: stackoverflow.com/a/55251560/4464702
RAnders00

54

Попередні відповіді пропонують використовувати sandboxesдля цього, але відповідно до документації :

Оскільки sinon@5.0.0, об’єкт sinon є пісочницею за замовчуванням.

Це означає, що зараз прибирати заглушки / знущання / шпигуни так само просто, як:

var sinon = require('sinon');

it('should do my bidding', function() {
    sinon.stub(some, 'method');
}

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

10
Це найкраща відповідь для тих, хто читає це після квітня 2018 року.
Нік Кокс

1
ще ближче: afterEach (sinon.restore)
Бенджам

Я думаю, що це краще, оскільки явні пісочниці створюють зайву складність. Чи справді вам знадобиться кілька окремих пісочниць з різними макетами одного і того ж об’єкта? Напевно, ні.
Герман

13

Оновлення відповіді на @keithjgrant.

З версії v2.0.0 і далі метод sinon.test переміщено в окремий sinon-testмодуль . Щоб пройти старі тести, потрібно налаштувати цю додаткову залежність у кожному тесті:

var sinonTest = require('sinon-test');
sinon.test = sinonTest.configureTest(sinon);

Крім того , ви без sinon-testі використання пісочниць :

var sandbox = sinon.sandbox.create();

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

it('should restore all mocks stubs and spies between tests', function() {
    sandbox.stub(some, 'method'); // note the use of "sandbox"
} 

1
Або ви можете просто скористатися пакетом тесту на синон та продовжувати свій код, як і раніше :-D
oligofren

10

Ви можете використовувати sinon.collection, як показано в цьому публікації блозі (від травня 2010 р.) Автором бібліотеки sinon.

Api sinon.collection змінився, і спосіб його використання такий:

beforeEach(function () {
  fakes = sinon.collection;
});

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

it('should restore all mocks stubs and spies between tests', function() {
  stub = fakes.stub(window, 'someFunction');
}

6

restore()просто відновлює поведінку заглушеної функціональності, але не відновлює стан заглушок. Вам доведеться або обернути свої тести sinon.testта використовувати this.stubабо індивідуально зателефонувати reset()на заглушки


6

Якщо ви хочете, щоб установка, яка матиме сион, завжди перезавантажується для всіх тестів:

в helper.js:

import sinon from 'sinon'

var sandbox;

beforeEach(function() {
    this.sinon = sandbox = sinon.sandbox.create();
});

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

Потім у вашому тесті:

it("some test", function() {
    this.sinon.stub(obj, 'hi').returns(null)
})

3

Зауважте, що при використанні квіта замість мокко їх потрібно загортати в модуль, наприклад

module("module name"
{
    //For QUnit2 use
    beforeEach: function() {
    //For QUnit1 use
    setup: function () {
      fakes = sinon.collection;
    },

    //For QUnit2 use
    afterEach: function() {
    //For QUnit1 use
    teardown: function () {
      fakes.restore();
    }
});

test("should restore all mocks stubs and spies between tests", function() {
      stub = fakes.stub(window, 'someFunction');
    }
);

3
qunit 2 переходить на beforeEachта afterEach. Методи setupта teardownметоди будуть застарілими.
Kevin Bullaughey

0

Створіть пісочницю, яка буде виконувати функцію контейнера з чорною скринькою для всіх ваших шпигунів, заглушок, макетів і підробок.

Все, що вам потрібно зробити, це створити пісочницю в першому описувальному блоці, щоб він був доступний у всіх тестових випадках. І коли ви закінчите з усіма тестовими кейсами, ви повинні випустити оригінальні методи та очистити заглушки, використовуючи метод sandbox.restore()у гачку AfterEach, щоб під час виконання він звільняв затримані ресурсиafterEach тестовий випадок був пропущений чи не .

Ось приклад:

 describe('MyController', () => {
    //Creates a new sandbox object
    const sandbox = sinon.createSandbox();
    let myControllerInstance: MyController;

    let loginStub: sinon.SinonStub;
    beforeEach(async () => {
        let config = {key: 'value'};
        myControllerInstance = new MyController(config);
        loginStub = sandbox.stub(ThirdPartyModule, 'login').resolves({success: true});
    });
    describe('MyControllerMethod1', () => {
        it('should run successfully', async () => {
            loginStub.withArgs({username: 'Test', password: 'Test'}).resolves();
            let ret = await myControllerInstance.run();
            expect(ret.status).to.eq('200');
            expect(loginStub.called).to.be.true;
        });
    });
    afterEach(async () => {
        //clean and release the original methods afterEach test case at runtime
        sandbox.restore(); 
    });
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.