【问题标题】:Mocha Sinon spy on imported functionMocha Sinon 窥探导入功能
【发布时间】:2016-10-08 03:36:30
【问题描述】:

如何在不将导入的所有功能包装到对象中的情况下监视导入的函数?

跟随 sn-p 我想如何测试:

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\""
  },
...

测试文件: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 方法。这样你就可以注入一个测试存根来模拟不同的边缘情况。关注?
  • 非常感谢,我明白你的意思了。我会重新考虑设计并阅读更多关于代码气味/软件设计的信息...... :)

标签: javascript mocha.js sinon spy


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2019-07-22
    • 2012-12-13
    相关资源
    最近更新 更多