在Jasmine测试中处理WebSocket连接

时间:2015-07-30 10:11:58

标签: javascript unit-testing websocket jasmine reactjs

我有<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? (我对测试非常陌生,所以这些概念现在对我来说非常陌生)

2 个答案:

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