javascript - 有没有一个函数可以测试一个在js中有回调的对象实例?

标签 javascript object promise callback sinon

我正在使用 sinon 来 stub 一个对象的实例,该实例在一个带有回调的函数中,我该如何测试它?。 我不知道如何测试这个,这会给我一个错误。

这是将 js 与 sinon 和 mocha 一起使用。

函数是:

import tracker from 'pivotaltracker';

export async function getPivotalProjects(token) {
  const clientTracker = new tracker.Client(token);
  const userProjects = () => new Promise((resolve, reject) => {
    clientTracker.projects.all((error, projects) => (projects ? resolve(projects) : reject(error)));
  });
  return userProjects();

测试是:

import tracker from 'pivotaltracker';
let spyTracker;
    beforeEach(() => {
      spyTracker = sinon.stub(tracker, 'Client');
    });

it('should do the request to get the activities from projects.', async () => {
      spyTracker.callsArgWith(1, null, [true, 'token']);
      // spyTracker.projects.all.returns('token');
      await PivotalTrackerApi.getPivotalProjects('token');
      sinon.assert.threw(spyTracker);
spyTracker.restore();
    });

这有什么问题吗?如果有人能帮助我就太好了。

最佳答案

getPivotalProjects 可以简化为:

export async function getPivotalProjects(token) {
  const clientTracker = new tracker.Client(token);
  await new Promise((resolve, reject) => {
    clientTracker.projects.all((error, projects) => (projects ? resolve(projects) : reject(error)));
  });
}

...它可以这样测试:

let clientStub;

beforeEach(() => {
  clientStub = sinon.stub(tracker, 'Client');
});

it('should do the request to get the activities from projects.', async () => {
  const allSpy = sinon.spy();
  clientStub.callsFake((token) => ({ projects: { all: allSpy } }));
  const promise = PivotalTrackerApi.getPivotalProjects('token');
  sinon.assert.calledWith(clientStub, 'token');  // Success!
  sinon.assert.called(allSpy);  // Success!
  const callback = allSpy.lastCall.args[0];
  callback(null, 'my projects');
  const result = await promise;
  expect(result).to.equal('my projects');  // Success!
});

关于javascript - 有没有一个函数可以测试一个在js中有回调的对象实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55310380/

相关文章:

javascript - 如何使用 async/await 同步而不是异步触发 forEach() ?

javascript - 异步等待无法正常工作

javascript - 通过 javascript 从具有值的数组中创建 arraylist

javascript - Django:语法错误:意外的标记<

javascript - JavaScript 上的火星到漫游者。我需要能够向流动站发出一系列命令并按顺序执行它们。

java - 将 toString 与对象创建相关联

c++ - 从 boost::threads 到 boost::asio 计时器

javascript - 如何将 AJAX 请求从 vanilla JS 重写为 JQuery?

javascript - 使用 ACF 字段中的内容动态填充 Contact Form 7 下拉字段

javascript - 如何链式 promise