我有<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<ul class="SubServicesList">
<li><a data-target="1">Name 1</a></li>
<li><a data-target="2">Name 2</a></li>
<li><a data-target="3">Name 3</a></li>
</ul>
<ul class="subServices">
<li class="subServiceItem" id="1">
1 hwiufhwriufhiurhfiureh
</li>
<li class="subServiceItem" id="2">
2 hwiufhwriufhiurhfiureh
</li>
<li class="subServiceItem" id="3">
3 hwiufhwriufhiurhfiureh
</li>
</ul>
:
test.login.js
通过提交表单,它会调用登录方法:
it('calls login when there\'s a username present', () => {
React.findDOMNode(LoginElement.refs.username).value = 'foo';
TestUtils.Simulate.submit(form);
expect(LoginElement.state.errored).toEqual(false);
});
所以我试图测试login() {
let typedUsername = React.findDOMNode(this.refs.username).value;
if (!typedUsername) {
return this.setState({
errored: true
});
}
// we don't actually send the request from here, but set the username on the AuthModel and call the `login` method below
AuthModel.set('username', typedUsername);
AuthModel.login();
},
的功能,而不是Login.jsx
,但是通过调用AuthModel.js
,它会通过WebSocket发送消息。但问题是,在我的实际应用程序中,我没有加载任何东西,直到WebSocket连接(我触发一个事件然后渲染React应用程序),但是在我的Jasmine测试中,我不等待这个事件,所以我收到了:
AuthModel.login()
我的测试失败了,它应该不会失败,因为它的封装功能可以实现我想要的功能。它只是错误进一步依赖树。
我最好的方法是解决这个问题,或者减轻尝试在我的测试环境中连接的WebSocket? (我对测试非常陌生,所以这些概念现在对我来说非常陌生)
答案 0 :(得分:0)
我不会假装对此有很多了解,但是您依赖注入AuthModel是怎么然后在测试中嘲笑它?对不起,这不是一个完整的答案,这正是我的第一直觉。
如果你需要一个库来帮助它,angular / di(来自angular2)非常棒。
答案 1 :(得分:0)
您可以使用Sinon JS模拟/存根服务器请求。 - http://sinonjs.org/
如果您只是想知道Auth.login向服务器发出请求,请使用sinon.stub(http://sinonjs.org/docs/#stubs),例如
var stub = sinon.stub($, 'ajax');
//Do something that calls $.ajax
//Check stub was called and arguments of first call:
console.log(stub.called)
console.log(stub.args[0])
stub.restore();
如果您的代码需要回复,请使用sinon的虚假服务器(http://sinonjs.org/docs/#server):
var server = sinon.fakeServer.create(),
myResults = [1, 2, 3];
//Set-up server response with correct selected tags
server.respondWith('POST', url, [200, {
'Content-Type': 'application/json'
},
JSON.stringify({
response: myResults
})
]);
//Do something which posts to the server...
sendToServer('abc').done(function(results) {
console.log('checking for results ', results);
})
server.restore();
使用服务器响应可以使用更多复杂功能 - 使用函数等来处理多种请求类型,例如
function initServer(respondOk) {
var server = sinon.fakeServer.create();
server.respondWith('POST', /.*\/endpoint\/.*/, function(request) {
var header = { 'Content-Type': 'application/json' };
if(!respondOk) {
var response = JSON.stringify([{
'error_code': '500',
'message': 'Internal server error'
}]);
request.respond(500, header, response);
} else {
var code = 200,
resources = JSON.parse(request.requestBody),
result = JSON.stringify({ customer: resources });
request.respond(code, header, result);
}
});
return server;
});