Как правильно заглушить возвращаемое значение функции?


Я пытаюсь смоделировать возвращаемое значение для метода моего класса и продолжаю получать эту ошибку:

не в порядке Неудовлетворенная проверка на двойном испытании. Разыскивается: - звонил с (true), Но не было никаких вызовов теста дважды.

Вот мой тестовый код:

// Imports for unit testing
const tap = require('tap');
const Subject = require('../src/iTunesClient.js');
const td = require('testdouble');

let reqJson;

// Ensure the iTunes class methods are called
tap.test('iTunesClient class methods function as intended', (t) => {
  t.beforeEach((ready) => {
    reqJson = td.replace('../src/reqJson.js');
    ready();
  });

  t.afterEach((ready) => {
    td.reset();
    ready();
  });

  t.test('iTunesClient.getData', (assert) => {
    const callback = td.function();
    const subject = new Subject();
    subject.setTerm('abc 123');
    subject.setURL();

    td.when(reqJson.get(td.callback)).thenCallback(true);

    subject.getData(callback);

    td.verify(callback(true));
    assert.end();
  });

  t.end();
});

В частности, эта строка связана с моей проблемой:

td.verify(callback(true));

Как я могу подделать значение обратного вызова true за reqJson.get()? Прямо сейчас, Subject.geData() это метод iTunesClient класс, который вызывает другой файл, reqJson.js, чтобы использовать его на экспорт get() метод.

2 ответа

Решение

Я хотел обновить этот вопрос, так как я недавно решил эту проблему. По сути, у меня было две проблемы:

  1. Учет обоих параметров функции reqJson
  2. Учет всех возвращаемых значений обратного вызова

Для теста двойная документация по пункту 1:

При передаче td.matchers.anything() любой вызов этой двойной тестовой функции будет игнорировать этот параметр при определении, удовлетворяет ли вызов заглушке.

Поэтому я скорректировал свою строку кода следующим образом:

До: td.when(reqJson.get(td.callback)).thenCallback(true);

После: td.when(reqJson.get(td.matchers.anything(), td.callback)).thenCallback(null, null, null);

Это немного трудно понять из вашего примера, но похоже, что вы требуете iTunesClient прежде чем позвонить td.replace, В этом случае реальный reqJson модуль будет необходим и кэширован в строке 3.

Вам нужно позвонить td.replace достаточно рано, чтобы избежать этого, например, между tap а также iTunesClient,

Другие вопросы по тегам