Мокко шпионов возвращает callCount 0 - PullRequest
0 голосов
/ 14 сентября 2018

Я использую мокко, чай и синон для юнит-тестирования в узле env.Мне нужно протестировать сценарий, в котором он вызывает службы для получения данных и их возврата.

Мой контроллер выглядит следующим образом:

{
   get model() { return schema},
   async findUser(data) {
      const data = await this.model.find({ id: data.id });
      return data;
   }
}

В моем тесте мокко я используюзаглушка Sinon для возврата модели и поиска функции примерно такой:

sinon.stub(controller, 'model').get(() => ({
    find: () => ({ username: 'asdf' })
}));

Мой тест работает, как и ожидалось.Теперь я хочу проверить, вызвал ли мой метод find id один раз и передали ли ему аргументы.Чтобы сделать это, я добавил следующий код

const spyFind = sinon.spy(controller.model, 'find');
assert.isTrue(spyFind.calledOnce);

. Это должно вернуть true, потому что вызывается spyFind и он возвращает ожидаемое фиктивное значение.Но когда я отлаживаю, объект spyFind сообщает isCalled «false».Может кто-нибудь помочь мне понять, что я делаю не так?

1 Ответ

0 голосов
/ 14 сентября 2018

При разработке вашей заглушки она будет возвращать новый объект каждый раз, когда вызывается controller.model.В результате:

controller.model === controller.model // false

Поэтому, когда вы пытаетесь шпионить за свойством find controller.model с помощью:

const spyFind = sinon.spy(controller.model, 'find');

Sinon захватывает объект, возвращаемый controller.model, и заглушкиfind на этот объект.В следующий раз, когда вы вызовете controller.model, например, в своем тесте, вы получите свежий объект из controller.model, за которым не следят.Таким образом, первоначальный шпион никогда не вызывается.

Я думаю, что лучший подход - предоставить отдельный заглушку, возвращаемую find(), тогда вы можете определить, называется ли заглушка:

const sinon = require('sinon')

let controller = {
    get model() { return schema},
    async findUser(data) {
        const data = await this.model.find({ id: data.id });
    return data;
    }
}

let findStub = sinon.stub()
findStub.returns({ username: 'asdf' })

sinon.stub(controller, 'model').get(() => ({
    find: findStub
}));

console.log(controller.model.find()) // { username: 'asdf' }
console.log(findStub.calledOnce);    // true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...