Mocha:确保在此测试中调用done()回调

时间:2016-10-29 19:16:18

标签: unit-testing http mocha sinon axios

我编写了一个使用airline的小型拦截器,它会刷新<style> ul {color: #777777;} ul.items-list {color: #880000;} .your-class-name {color: #008800;} </style> <body> <ul class="items-list"> <li><a>item 1</a></li> <li>item 2 <ul> <li><a>item 2-a</a></li> <li><a>item 2-b</a></li> </ul> </li> <li><a>item 3</a></li> <li>item 4 <ul> <li><a>item 4-a</a></li> <li><a>item 4-b</a></li> </ul> </li> <li><a>item 5</a></li> <li><a>item 6</a></li> </ul> </body> <script> var $list = $('ul.items-list'); $list.children('li:nth-child(2), li:nth-child(4)').addClass('your-class-name'); </script> 并在响应代码为401时将用户重定向到登录页面。 它工作正常,但我在单元测试中遇到一些错误。

测试

axios

我得到了这两个警告:

localBrowserStorage

这个错误:
describe('Api Service', () => { let sandbox; beforeEach(() => { moxios.install(); sandbox = sinon.sandbox.create(); }); afterEach(() => { moxios.uninstall(); sandbox.restore(); }); describe.only('interceptors', () => { it('clear storage and redirect to login if response status code is 401', (done) => { moxios.withMock(() => { sandbox.spy(browserHistory, 'push'); sandbox.spy(storage, 'clear'); axios.get('/test'); moxios.wait(() => { const request = moxios.requests.mostRecent(); request.respondWith({ status: 401, response: {} }).then(() => { expect(browserHistory.push).to.have.been.calledWith('/login'); expect(storage.clear).to.have.been.called; // eslint-disable-line no-unused-expressions done(); }); }); }); }); }); });

修改

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Request failed with status code 401
(node:5338) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): AssertionError: expected push to have been called with arguments /login

1 个答案:

答案 0 :(得分:4)

您需要通过调用done处理程序中的catch将拒绝回传给Mocha:

request.respondWith({
  status: 401,
  response: {}
}).then(() => {
  expect(browserHistory.push).to.have.been.calledWith('/login');
  expect(storage.clear).to.have.been.called; // eslint-disable-line no-unused-expressions
  done();
}).catch(done);

如果您不处理被拒绝的承诺,则done永远不会被调用(导致超时)。

例如,如果其中一个期望失败,则会抛出错误。当发生这种情况时,在期望行之后对done的调用永远不会被执行。您可以(并且应该)使用.catch子句捕获错误,如上所述。这应该调用done错误。我使用的代码简称:

.catch(function(err) {
  done(err);
})