如何正确存根函数返回值?

时间:2017-10-06 19:55:45

标签: javascript node.js unit-testing testdoublejs

  • 前提: JS ES6,NodeJS
  • 测试框架: TAP
  • 模拟图书馆: testdouble.js

我试图模拟我的类的方法的返回值并继续收到此错误:

  

不正确对测试双重验证不满意。通缉: - 用(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 个答案:

答案 0 :(得分:0)

从您的示例中说出来有点难,但在致电iTunesClient之前,您似乎需要td.replace。在这种情况下,将需要真正的reqJson模块并在第3行缓存。

您需要尽早致电td.replace以避免这种情况,例如在需要tapiTunesClient之间。

答案 1 :(得分:0)

我想更新这个问题,因为我最近解决了这个问题。基本上,我有两个问题:

  1. 同时考虑reqJson函数参数
  2. 说明所有回拨返回值
  3. 第1项的每testdouble documentation次数:

      

    当传递td.matchers.anything()时,在确定调用是否满足存根时,对该测试double函数的任何调用都将忽略该参数。

    因此,我调整了我的代码行如下:

    之前: td.when(reqJson.get(td.callback)).thenCallback(true);

    之后: td.when(reqJson.get(td.matchers.anything(), td.callback)).thenCallback(null, null, null);