2016-06-08 7 views
4

Как я могу отслеживать импортированную функцию без переноса всех функций импорта в объект?Mocha 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' возвращает сеанс - если это так, вы знаете, что это сработало. Тем не менее, он по-прежнему пахнет, потому что вы не можете поменять свою фабрику. Я бы добавил метод 'setFactory' к вашему объекту' SessionHandler'. Таким образом, вы можете ввести тестовый заглушку, чтобы имитировать различные случаи кромок. Следить? –

+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);

Смежные вопросы