Утверждать аргументы о заглушенных методах с помощью sinon - PullRequest
0 голосов
/ 04 декабря 2018
import ManagerDaoStub from '../salesforce/__test__/ManagerDaoStub';
import criticalMerchants from '../criticalMerchants';
describe('criticalMerchants Unit Tests', () => {
    before(() => {
        ManagerDaoStub.initStubs();    
    });
    after(() => {
        ManagerDaoStub.restoreStubs();
    });
    it('assert the arguments of stubbed method', (done)=>{
        let load = criticalMerchants.createCases(MERCHANT, DEVICE_ID, KEY, {});
        return done();
    });
})

Это тестовый файл, написанный в узле criticalMerchants.test.js.Метод, который я хочу проверить, который createCases использует метод в ManagerDao, который был введен в ManagerDaoStub, как показано ниже.

import ManagerDao from '../ManagerDao';
class ManagerDaoStub {

    constructor() {
       this.sandbox = sinon.sandbox.create();
        }
    initStubs(sandbox) {
        this.sandbox = sandbox || this.sandbox;
        this.restoreStubs();
        this.initFindOpenCases();   
    }
    restoreStubs() {
        this.sandbox.restore();
    }
    initFindOpenCases() {
        let findOpenCases = this.sandbox.stub(ManagerDao, "findOpenCases");
        findOpenCases
            .withArgs(DEVICE_ID, KEY, match.func)
            .callsArgWith(2, new Error("Test error"));
   }
}

Я хочу подтвердить, является ли этот метод initFindOpenCasesбыл вызван с правильными аргументами (DEVICE_ID, KEY, null).Я использовал sinon.assert.calledWith(ManagerDaoStub.initFindOpenCases, DEVICE_ID, KEY, null), и это выдает следующую ошибку:

AssertError: initFindOpenCases () не является заглушкой.

Может кто-нибудь предложить правильный способ сделать это?

1 Ответ

0 голосов
/ 06 декабря 2018

Прежде всего, если ManagerDao.initFindOpenCases является методом экземпляра (я не уверен, так как вы не поделились его определением), то вы не можете заглушить его в конструкторе, как вы сделали здесь:

let findOpenCases = this.sandbox.stub(ManagerDao, "findOpenCases")

Вам нужно сначала создать экземпляр - затем заглушить его в этом экземпляре - или поставить заглушку на самом прототипе так:

let findOpenCases = this.sandbox.stub(ManagerDao.prototype, "findOpenCases"); 

Во-вторых, вы делаете то же самоеснова ошибка в вашем утверждении в сочетании с другим:

sinon.assert.calledWith(ManagerDaoStub.initFindOpenCases, DEVICE_ID, KEY, null)

ManagerDaoStub является конструктором, и у него нет свойства initFindOpenCases.Его прототип делает, и таким образом его экземпляры делают то же самое.Кроме того, ManagerDaoStub.prototype.initFindOpenCases это все еще не заглушка.Это метод, который вы вызываете для создания заглушки, но сам по себе он не является заглушкой.Проще говоря, вы смешиваете ManagerDao с ManagerDaoStub.

Если вы сделаете пример изменения выше, вы можете заставить свое утверждение работать так:

sinon.assert.calledWith(ManagerDao.prototype.initFindOpenCases, DEVICE_ID, KEY, null)

Однако , это не все, что я бы рекомендовал изменить.Эта последняя путаница возникает в основном потому, что вы значительно усложняете код настройки вашего теста.Вам не нужно создавать целый класс, чтобы заглушить один метод ManagerDao.

Вместо этого просто замените ваши before и after вызовы следующими:

beforeEach(() => {
    // Create the stub on the prototype.
    sinon.stub(ManagerDao.prototype, 'findOpenCases')
        .withArgs(DEVICE_ID, KEY, sinon.match.func)
        .callsArgWith(2, newError('Test Error'));
});
afterEach(() => {
    // As of sinon 5.0.0, the sinon object *is* a sandbox, so you can
    // easily restore every fake you've made like so:
    sinon.restore();
});

Помимопоэтому я рекомендую глубоко изучить разницу между свойствами конструктора и свойствами его прототипа.Это знание сделает такие вещи намного проще для вас.Лучшее место для начала, вероятно, здесь, на MDN .

...