Sinon taslaklarını kolayca temizleme


135

Her bloktan önce mocha ile temiz bir şekilde çalışacak tüm sinon casus alaylarını ve taslaklarını kolayca sıfırlamanın bir yolu var mı?

Korumalı alanın bir seçenek olduğunu görüyorum, ancak bunun için bir korumalı alanı nasıl kullanabileceğinizi görmüyorum

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

Yanıtlar:


304

Sinon kullanımı yoluyla bu işlevi sağlayan kum havuzu birkaç şekilde kullanılabilir:

// 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"
}

veya

// 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 Zaman uyumsuz testleriniz olduğunda, ilk yöntemi kullanmanız gerekir, aksi takdirde sinon testinizin yürütülmesini tamamlamadan önce saplarını temizler.
keithjgrant

3
Eğer sinon> 5.0 kullanıyorsanız aşağıyı okuyun. Şimdi çok daha kolay bir yöntem var: stackoverflow.com/a/55251560/4464702
RAnders00

54

Önceki cevaplar sandboxesbunu gerçekleştirmek için kullanılmasını önermektedir , ancak belgelere göre :

Sinon@5.0.0'dan beri, sinon nesnesi varsayılan bir korumalı alan.

Bu, taslaklarınızı / alaylarınızı / casuslarınızı temizlemenin artık daha kolay olduğu anlamına gelir:

var sinon = require('sinon');

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

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

10
Bu, Nisan 2018'den sonra bunu okuyan herkes için en iyi cevaptır.
Nick Cox

1
hatta neeter: afterEach (sinon.restore)
Benjam

Bence bu daha iyi çünkü açık sanal alanlar gereksiz karmaşıklık yaratıyor. Gerçekten aynı nesnenin farklı alaylarıyla birkaç ayrı sanal alana ihtiyacınız olacak mı? Muhtemelen değil.
Gherman

13

@Keithjgrant yanıtı için bir güncelleme.

Sürüm v2.0.0'dan itibaren, sinon.test yöntemi ayrı bir sinon-testmodüle taşınmıştır . Eski testleri geçmek için her testte bu ekstra bağımlılığı yapılandırmanız gerekir:

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

Alternatif olarak, sanal alan olmadan da sinon-testkullanabilirsiniz :

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
Veya sadece sinon-test paketini kullanabilir ve kodunuza daha önce olduğu gibi devam edebilirsiniz :-D
oligofren

10

Gösterildiği gibi sinon.collection kullanabilir bu aracını sinon kütüphanesinin yazarı tarafından blog yazısında (Mayıs 2010 tarihli) .

Sinon.collection api değişti ve onu kullanmanın bir yolu şudur:

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()sadece stubbed işlevselliğinin davranışını geri yükler, ancak stub'ların durumunu sıfırlamaz. Testlerinizi sarmanız ve saplamaları sinon.testkullanmanız this.stubveya tek tek çağırmanız gerekirreset()


6

Sinon olacak bir kurulum istiyorsanız, tüm testler için her zaman kendini sıfırlayın:

helper.js'de:

import sinon from 'sinon'

var sandbox;

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

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

Ardından, testinizde:

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

3

Mocha yerine qunit kullanırken, bunları bir modüle sarmanız gerektiğini unutmayın, örn.

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 beforeEachve konumuna geçiyor afterEach. setupVe teardownyöntemler kaldırılacaktır.
Kevin Bullaughey

0

Tüm casuslarınız, taslaklarınız, alaycılarınız ve taklitleriniz için bir kara kutu konteyneri görevi görecek bir sanal alan oluşturun.

Yapmanız gereken tek şey, ilk test bloğunda bir sandbox oluşturmaktır, böylece tüm test senaryolarında erişilebilir. Ve tüm test sandbox.restore()senaryolarını bitirdikten sonra, orijinal yöntemleri serbest bırakmalı ve afterEach kancasındaki yöntemi kullanarak saplamaları temizlemelisiniz, böylece çalışma zamanında tutulan kaynakları serbest bırakırafterEach test geçmesi veya başarısız olması.

İşte bir örnek:

 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(); 
    });
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.