2016-01-23 60 views
0

我坚持测试在柴和Sinon的先例。一般来说,我得到的服务是xhr请求的包装,它返回承诺。我想这样来测试它:测试承诺的服务与柴和Sinon

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);没有结果
//尝试与柴作为许诺的 - 不知道如何使用它:-(
//在我的环境不能安装sinon-as-promised只能选择NPM模块

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

+1

你调用'()完成'你的断言之前,而当你的测试已经完全结束它应该被称为。另外,是'service.get()'同步还是异步? – robertklep

+0

@robertklep:好的,我不知道最后完成了()。 'service.get'是异步的(用于D3 XHR的包装) – cachaito

回答

1

有各种各样的挑战在这里:

  • 如果service.get()是异步的,你需要等待检查你的断言前建成;
  • 由于(建议的)解决方案检查承诺处理程序中的断言,因此必须小心异常。而不是使用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; 
}); 
+0

它工作正常!谢谢@robertklep。 – cachaito

相关问题