2016-06-08 90 views
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() {} 
+0

一对夫妇的想法。除非你知道你在做什么,否则使用间谍是一种代码味道。你想测试的是'handleClientConnection'返回一个会话 - 如果是的话,你知道它工作。然而,它仍然闻起来,因为你不能换出你的工厂。我会为'SessionHandler'对象添加一个'setFactory'方法。这样你可以注入一个测试存根来模拟不同的边界情况。跟随? –

+0

非常感谢,我明白你的意思。我将重新考虑设计并阅读更多关于代码气味/软件设计的信息...... :) – paesu

回答

0

看看https://github.com/speedskater/babel-plugin-rewire

import {create, __RewireAPI__ as RewireAPI} as SessionFactory from '../../server/session/sessionFactory'; 
 
... 
 
createSpy = sinon.spy(); 
 
RewireAPI.__Rewire__('create', createSpy) 
 
... 
 
expect(createSpy.calledOnce).to.equal(true);