source

쉽게 sinon stubs 치우기

ittop 2023. 9. 19. 21:23
반응형

쉽게 sinon stubs 치우기

각 블록 이전에 모카와 함께 깨끗하게 작동할 모든 사이논 스파이 모의와 스텁을 쉽게 리셋할 수 있는 방법이 있습니까?

샌드박스를 선택할 수는 있지만 샌드박스를 어떻게 사용할 수 있는지 알 수 없습니다.

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

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"
}));

이전 답변에서는 다음을 사용할 것을 제안합니다.sandboxes이를 달성하기 위해, 그러나 문서에 따르면:

sinon@5.0.0 이후 sinon 개체는 기본 샌드박스입니다.

이는 이제 스터브/모의/스파이를 정리하는 것이 다음과 같이 쉽다는 것을 의미합니다.

var sinon = require('sinon');

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

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

@keithjgrant 답변 업데이트.

v2.0.0 이후 버전부터는 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"
} 

당신은 sinon 라이브러리의 작성자에 의해 본 블로그 포스트(2010년 5월 날짜)에 나와 있는 sinon.collection을 사용할 수 있습니다.

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');
}

restore()스텁 기능의 동작을 복원할 뿐 스텁의 상태를 재설정하지는 않습니다.시험을 다음과 같이 마무리해야 합니다.sinon.test사용.this.stub또는 개별적으로 전화를 걸거나reset()무턱대고

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)
})

mocha 대신 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');
    }
);

당신의 스파이, 스텁, 모조품, 가짜 모두를 위한 블랙박스 컨테이너 역할을 할 샌드박스를 만드십시오.

모든 테스트 사례를 통해 액세스할 수 있도록 맨 처음 설명 블록에 샌드박스를 만들기만 하면 됩니다.그리고 모든 테스트 케이스가 끝나면 원래의 메소드를 해제하고 메소드를 사용하여 스텁을 정리해야 합니다.sandbox.restore()실행 시 보류된 리소스를 해제하도록 각 후크에서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(); 
    });
});

아래에서는 모든 스터브 및 중첩 스터브를 재설정합니다.

sinon.reset();

아니면 당신이 NameOfFunctiontionYouWantToReset.resetHistory();

맘에 들다addingStub.resetHistory();

언급URL : https://stackoverflow.com/questions/11552991/cleaning-up-sinon-stubs-easily

반응형