背景
我有一个使用 crossbar 注册一些 RPC 的服务器,以及一个试图确保使用 sinon 调用 RPC 的测试。
代码
server.js
"use strict";
const autobahn = require( "autobahn" );
const server = () => {
const open = () => console.log( "Hello world" );
const start = () => new Promise( fulfil => {
const connection = new autobahn.Connection( {
"url": "ws://localhost:8080/ws",
"realm": "realm1"
} );
connection.onopen = session => {
session.register( "server.open", open )
.then(() => fulfil())
.catch(console.log);
};
connection.open();
} );
//removing Object.freeze won't help =(
return Object.freeze({
start,
open
});
};
module.exports = server;
此服务器简单地连接到交叉开关,然后注册 open
RPC。
现在是我的测试用例。我正在使用 mocha 和 chai:
test.js
"use strict";
const expect = require( "chai" )
.expect;
const autobahn = require( "autobahn" );
const sinon = require( "sinon" );
const serverFactory = require( "./server.js" );
describe( "server", () => {
const server = serverFactory();
const crossbar = {
connection: undefined,
session: undefined
};
const connectToCrossbar = () => new Promise( fulfil => {
crossbar.connection = new autobahn.Connection({
"url": "ws://localhost:8080/ws",
"realm": "realm1"
});
crossbar.connection.onopen = session => {
crossbar.session = session;
fulfil();
};
crossbar.connection.open();
} );
before( "start server", done => {
server.start()
.then( connectToCrossbar )
.then( done )
.catch( err => done( err ) );
} );
it( "should open", done => {
const openSpy = sinon.spy( server, "open" );
crossbar.session.call( "server.open", [] )
.then( () => {
expect( openSpy.called ).to.be.true;
done();
} )
.catch( err => done( err ) );
} );
} );
此测试也打开到 crossbar 的连接,然后调用服务器上的 open
方法。
问题
问题是,即使我看到 Hello World
console.log,证明该方法实际上已执行,但由于 openSpy.called
,我的测试总是失败> 始终为 false
(即使调用了侦测方法!)。
我尝试了什么
- 删除
Object.freeze
。我知道 spy 和 stub 实际上取代了他们正在监视的函数和对象,但在这种情况下,它没有帮助。 - 使用
stub
而不是spy
。当我的 spy 不起作用时,我尝试用stub
替换open
方法并使用callsFake
来完成测试。不幸的是,callsFake
似乎从未被调用过...... - 使用
setTimeout
。我认为发生这种情况的原因可能是我即将进行测试,所以我创建了一个setTimeout
和0
进化了expect
陈述。也失败了。
问题
- 我做错了什么?
- 我该如何解决?
最佳答案
免责声明
此解决方案基于我对 crossbar 的测试和了解。如果我错了,请随时纠正我。
我的结论
在 crossbar
的许多其他问题中,其中之一是无法进行任何类型的测试。 autobahn
,作为crossbar
的库,也存在这些问题。
我的代码不起作用的原因是另一个进程实际上正在调用我的 open
函数而不是我的应用程序。因此运行测试的进程永远不知道函数被调用了。
解决办法是让open
函数返回一个结果,然后测试我们是否收到结果:
it( "should be able to call registered RPCs", done => {
server.getSession().call( "test1", [] )
.then( response => {
expect( response ).to.eql( "Hello World" );
done();
} )
.catch( err => done( err ) );
} );
在现实中使用这个中间件一切都很难测试......但至少现在我有办法了!
关于javascript - Sinon.js spy.called 不适用于 RPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44152870/