0

我是 JS 测试的初学者,当我尝试在需要测试的文件中模拟常量的值时遇到问题。

我有以下文件

// index.js
const { MultiAccounts } = require('../../some.js')

const MultiAccountInstance = new MultiAccounts();
...

const syncEvents = () => Promise.try(() => {
    // ...
    return MultiAccountInstance.all()
       .then((accounts) => // ...); // ==> it throws the exception here Cannot read property 'then' of undefined
});

module.exports = syncEvents;

所以,我想模拟MultiAccountInstance常量。我一直在尝试使用 Simon 并重新布线,但是使用下面的脚本我让它在这里抛出异常无法读取上面脚本中未定义异常的属性 'then'。

//index.test.js
const rewire = require('rewire');
const indexRewired = rewire('.../../index/js');

describe('testing sync events', () => {
    let fakeMultiAccountInstance, MultiAccountInstanceReverter;
    let accounts;

    beforeEach(() => {
        accounts = [{id: 1}, {id: 2}];
        fakeMultiAccountInstance = {};
        fakeMultiAccountInstance.all = () => Promise.resolve(accounts);

        MultiAccountInstanceReverter = indexRewired.__set__('MultiAccountInstance', fakeMultiAccountInstance);
    });

    afterEach(() => {
        MultiAccountInstanceReverter();
    });

    it('testing', ()=> {
        const spy = sinon.stub(fakeMultiAccountInstance, 'all');
        return indexRewired().then((resp) => {
            spy.restore();
            expect(spy).to.have.been.calledWith({someParams: true});
        });
    })
});

我怎样才能做到这一点?我也尝试使用存根,但我遇到MultiAccountInstance.all 不是函数的错误

是这样的

//index.test.js
const rewire = require('rewire');
const indexRewired = rewire('.../../index/js');

describe('testing sync events', () => {
    let stubMultiAccountInstance, MultiAccountInstanceReverter;
    let accounts;

    beforeEach(() => {
        accounts = [{id: 1}, {id: 2}];

        stubMultiAccountInstance= sinon.stub().returns({
          all: () => Promise.resolve(accounts), // also tried with sinon.stub().resolves(accounts)
        });

        MultiAccountInstanceReverter = indexRewired.__set__('MultiAccountInstance', stubMultiAccountInstance);
    });

    afterEach(() => {
        stubMultiAccountInstance.reset();
        MultiAccountInstanceReverter();
    });

    it('testing', ()=> {
        return indexRewired().then((resp) => {
            expect(stubMultiAccountInstance).to.have.been.calledWith({someParams: true});
        });
    })
});

你知道我做错了什么吗?

4

1 回答 1

0

这是单元测试解决方案:

index.js

const { MultiAccounts } = require('./some.js');
const Promise = require('bluebird');

let MultiAccountInstance = new MultiAccounts();

const syncEvents = () =>
  Promise.try(() => {
    return MultiAccountInstance.all().then((accounts) => console.log(accounts));
  });

module.exports = syncEvents;

some.js

function MultiAccounts() {
  async function all() {}

  return {
    all,
  };
}

module.exports = { MultiAccounts };

index.test.js

const sinon = require('sinon');
const rewire = require('rewire');
const Promise = require('bluebird');

describe('61659908', () => {
  afterEach(() => {
    sinon.restore();
  });
  it('should pass', async () => {
    const promiseTrySpy = sinon.spy(Promise, 'try');
    const logSpy = sinon.spy(console, 'log');
    const indexRewired = rewire('./');
    const accounts = [{ id: 1 }, { id: 2 }];
    const fakeMultiAccountInstance = {
      all: sinon.stub().resolves(accounts),
    };
    indexRewired.__set__('MultiAccountInstance', fakeMultiAccountInstance);
    await indexRewired();
    sinon.assert.calledOnce(fakeMultiAccountInstance.all);
    sinon.assert.calledWith(logSpy, [{ id: 1 }, { id: 2 }]);
    sinon.assert.calledOnce(promiseTrySpy);
  });
});

带有覆盖率报告的单元测试结果:

  61659908
[ { id: 1 }, { id: 2 } ]
    ✓ should pass (54ms)


  1 passing (62ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |      80 |     100 |                   
 index.js |     100 |      100 |     100 |     100 |                   
 some.js  |     100 |      100 |      50 |     100 |                   
----------|---------|----------|---------|---------|-------------------
于 2020-05-08T03:44:03.257 回答