背景
我有一个使用交叉开关注册一些 RPC 的服务器,以及一个试图确保使用 sinon 调用 RPC 的测试。
代码
服务器.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。
现在我的测试用例。我正在使用带有 chai 的 mocha:
测试.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 ) );
} );
} );
该测试也打开了与交叉开关的连接,然后调用open
服务器上的方法。
问题
问题是,即使我看到了Hello World
console.log,证明该方法实际上已执行,但我的测试总是失败,因为 openSpy.called
总是false
(即使调用了 spied 方法!)。
我试过的
- 删除
Object.freeze
. 我知道间谍和存根实际上替换了他们正在监视的函数和对象,但在这种情况下,它没有帮助。 - 使用 a
stub
而不是spy
. 当我的间谍不起作用时,我尝试用open
a 替换该方法stub
并使用callsFake
来完成测试。不幸的是callsFake
,似乎从来没有被称为... - 使用
setTimeout
. 我想可能发生这种情况的原因是我很快就会进行测试,所以我创建了一个setTimeout
不断0
发展的expect
声明。也失败了。
问题
- 我究竟做错了什么?
- 我该如何解决?