测试与Chai和Sinon的承诺服务

时间:2016-01-23 11:04:59

标签: javascript sinon sinon-chai

我坚持在Chai和Sinon测试承诺。通常我得到的服务是xhr请求的包装器,它返回promises。我试着像那样测试它:

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模块

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

1 个答案:

答案 0 :(得分:1)

这里面临各种挑战:

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

试试这个:

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;
});