0

我需要为以下classA编写一个单元测试。我不想测试 methodA 而是设置一个虚拟方法:

const classB = require('classB');
function a() {
  const b = classB();
  b.methodA();
}

我尝试使用重新布线:

const classA = rewire('classA');
const classBMock = require('classB');
classBMock.prototype.methodA = function() {
}
classA.__set__('classB', classBMock);
classA.a();

有没有更好的方法来实现我的目标?

谢谢!

4

1 回答 1

1

你做得对。使用rewire包,设置一个模拟classB对象。但不建议用模拟的方法覆盖原型上的方法。执行测试用例后,您必须将其恢复为原始状态。否则,classBwith mockedmethodA可能会导致其他测试失败。

更好的方法是使用依赖注入。classB为每个测试用例创建一个模拟对象并将其传递给a如下函数:

function a(b) {
  b.methodA();
}

// test file
const b = { 
  methodA() {
    console.log('stubbed methodA');
  } 
}
a(b);

这样可以更好地保证测试用例之间测试替身的隔离。

于 2020-10-10T07:59:43.727 回答