Javascript Mocha Sinon spy on导入功能

Javascript Mocha Sinon spy on导入功能,javascript,mocha.js,sinon,spy,Javascript,Mocha.js,Sinon,Spy,如何在不将导入的所有功能包装到对象中的情况下监视导入的函数 下面是我想如何测试的片段: import {create} from '../../server/session/sessionFactory'; ... create = sinon.spy(create); // doesn't work, create is read-only! ... expect(createSpy.calledOnce).to.equal(true); 它将如何工作,但我不想导入所有内容: import

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

下面是我想如何测试的片段:

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);
    });
  });
});
'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;
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);
    });
  });
});
'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() {}
看看

从“../../server/session/SessionFactory”导入{create,_-RewireAPI__-u-as-RewireAPI}作为SessionFactory;
...
createSpy=sinon.spy();
重新布线。重新布线(“创建”,createSpy)
...

expect(createSpy.calledOnce).to.equal(true)一些想法。除非你知道自己在做什么,否则使用间谍是一种代码气味。您要测试的是
handleClientConnection
返回一个会话-如果返回,您就知道它工作了。然而,它仍然有气味,因为你不能更换你的工厂。我将向您的
SessionHandler
对象添加一个
setFactory
方法。这样,您就可以注入一个测试存根来模拟不同的边缘情况。跟着?非常感谢,我明白你的意思。我将重新思考设计,并阅读更多关于代码气味/软件设计的内容…:)