4
我如何窥探导入的功能,而不包括导入到对象的所有功能?摩卡Sinon间谍进口功能
继我怎么也想测试片段:
import {create} from '../../server/session/sessionFactory';
...
create = sinon.spy(create); // doesn't work, create is read-only!
...
expect(createSpy.calledOnce).to.equal(true);
它是如何工作的,但我不希望导入的一切:
import * as SessionFactory from '../../server/session/sessionFactory';
...
createSpy = sinon.spy(SessionFactory, 'create');
...
expect(createSpy.calledOnce).to.equal(true);
或者被包裹的路要走在这种情况下?
谢谢:)
为了完整起见,这里所涉及的文件:
的package.json
...
"scripts": {
"test:backend": "mocha --compilers js:babel-core/register \"test/**/*.js\"",
"test": "parallelshell \"npm run test:backend\""
},
...
testfile的:sessionHandler.js
'use strict'
import sinon from 'sinon';
import {
expect
} from 'chai';
import sessionHandler from '../../server/session/sessionHandler';
import * as SessionFactory from '../../server/session/sessionFactory';
// import {create} from '../../server/session/sessionFactory';
describe('sessionHandler',() => {
describe('handleClientConnection',() => {
let webServer, createSpy;
beforeEach(() => {
createSpy = sinon.spy(SessionFactory, 'create');
// create = sinon.spy(create);
webServer = {};
});
afterEach(() => {
createSpy.restore();
// create.restoer();
});
it('should create a new session',() => {
sessionHandler.handleClientConnection(webServer);
expect(createSpy.calledOnce).to.equal(true);
});
});
});
sessionHandler。 js
个'use strict'
import * as SessionFactory from './sessionFactory';
const SessionHandler = {
sessions: [],
handleClientConnection(webServer) {
return createSession(this.sessions);
}
}
function createSession(sessions) {
let session = SessionFactory.create();
sessions.push(session);
return session;
}
export default SessionHandler;
sessionFactory.js
'use strict';
export function create() {
return new Session();
}
function Session() {}
一对夫妇的想法。除非你知道你在做什么,否则使用间谍是一种代码味道。你想测试的是'handleClientConnection'返回一个会话 - 如果是的话,你知道它工作。然而,它仍然闻起来,因为你不能换出你的工厂。我会为'SessionHandler'对象添加一个'setFactory'方法。这样你可以注入一个测试存根来模拟不同的边界情况。跟随? –
非常感谢,我明白你的意思。我将重新考虑设计并阅读更多关于代码气味/软件设计的信息...... :) – paesu