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() {}
Пару мыслей. Если вы не знаете, что делаете, использование шпионов - это запах кода. Что вы хотите проверить, так это то, что 'handleClientConnection' возвращает сеанс - если это так, вы знаете, что это сработало. Тем не менее, он по-прежнему пахнет, потому что вы не можете поменять свою фабрику. Я бы добавил метод 'setFactory' к вашему объекту' SessionHandler'. Таким образом, вы можете ввести тестовый заглушку, чтобы имитировать различные случаи кромок. Следить? –
Большое спасибо, я понимаю, что вы имеете в виду. Я переосмыслил дизайн и прочитал немного больше о запахах кода/разработке программного обеспечения ... :) – paesu