2016-06-08 93 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);