Sinon 스텁을 쉽게 정리


135

mocha의 beforeEach 블록과 함께 잘 작동하는 모든 sinon spy mock 및 stub을 쉽게 재설정하는 방법이 있습니까?

샌드 박싱이 옵션이지만 샌드 박스를 어떻게 사용할 수 있는지 모르겠습니다.

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은 몇 가지 방법으로 사용할 수있는 Sandboxes를 사용하여이 기능을 제공합니다 .

// 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 년 4 월 이후에이 기사를 읽는 사람에게 가장 적합한 답변입니다.
Nick Cox

1
조차 : afterEach (sinon.restore)
Benjam

명시적인 샌드 박스가 불필요한 복잡성을 야기하기 때문에 이것이 더 낫다고 생각합니다. 동일한 객체의 다른 모형이있는 여러 개의 별도 샌드 박스가 실제로 필요합니까? 아마 아닙니다.
Gherman

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
또는 실제로 sinon-test 패키지를 사용하여 이전과 같이 코드를 계속 사용할 수 있습니다. -D
oligofren

10

에 도시 된 바와 같이, 당신은 sinon.collection를 사용할 수있다 sinon 라이브러리의 저자 (2010 년 5 월 월 일자) 블로그 게시물.

sinon.collection API가 변경되었으며이를 사용하는 방법은 다음과 같습니다.

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

sinon이있는 설정을 원하는 경우 항상 모든 테스트에 대해 자체적으로 재설정됩니다.

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

모카 대신 qunit을 사용하는 경우이를 모듈로 감싸 야합니다 (예 :

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입니다. setupteardown방법은 더 이상 사용되지 않습니다.
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(); 
    });
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.