我编写了一个使用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
答案 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);
})