【问题标题】:testing promised service with Chai and Sinon与 Chai 和 Sinon 测试承诺的服务
【发布时间】:2016-04-29 23:51:48
【问题描述】:

我一直在 Chai 和 Sinon 中测试 Promies。通常,我使用 is wrapper 为 xhr 请求提供服务,它返回承诺。我试着这样测试它:

beforeEach(function() {
    server = sinon.fakeServer.create();
});

afterEach(function() {
    server.restore();
});

describe('task name', function() {
    it('should respond with promise error callback', function(done) {

        var spy1 = sinon.spy();
        var spy2 = sinon.spy();

        service.get('/someBadUrl').then(spy1, spy2);

        server.respond();
        done();

        expect(spy2.calledOnce).to.be.true;
        expect(sp2.args[0][1].response.to.equal({status: 404, text: 'Not Found'});
    });
});

我的笔记:

// spy2 在期望完成断言之后被调用
// 尝试使用 var timer = sinon.useFakeTimers() 和 timer.tick(510); 没有结果
// 尝试使用 chai-as-promised - 不知道如何使用它:-(
// 无法安装 sinon-as-promised 仅在我的环境中可用的选定 npm 模块

任何想法如何修复此代码/测试此服务模块?

【问题讨论】:

  • 您在断言之前调用done(),而应该在您的测试完全完成时调用它。还有,service.get() 是同步的还是异步的?
  • @robertklep:好吧,我最后不知道 done()。 service.get 是异步的(D3 XHR 的包装器)

标签: javascript sinon sinon-chai


【解决方案1】:

这里有各种挑战:

  • 如果service.get() 是异步的,您需要等待其完成后再检查您的断言;
  • 由于(建议的)解决方案会检查 Promise 处理程序中的断言,因此您必须小心异常。我不会使用done(),而是选择使用 Mocha(我假设你正在使用)内置的 Promise 支持。

试试这个:

it('should respond with promise error callback', function() {
  var spy1 = sinon.spy();
  var spy2 = sinon.spy();

  // Insert the spies as resolve/reject handlers for the `.get()` call,
  // and add another .then() to wait for full completion.
  var result = service.get('/someBadUrl').then(spy1, spy2).then(function() {
    expect(spy2.calledOnce).to.be.true;
    expect(spy2.args[0][1].response.to.equal({status: 404, text: 'Not Found'}));
  });

  // Make the server respond.
  server.respond();

  // Return the result promise.
  return result;
});

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多