NodeJS:class 调用另一个 class 的构造函数和函数的单元测试
NodeJS: Unit Test for class calling constructor and functions of another class
我需要为以下 A 类编写单元测试。我不想测试 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();
有没有更好的方法来实现我的目标?
谢谢!
你做得对。使用 rewire
包,设置一个模拟的 classB
对象。但是不建议用模拟的方法覆盖原型上的方法。你必须在执行完测试用例后恢复到原来的状态。否则,带有 mocked methodA
的 classB
可能会导致其他测试失败。
更好的方法是使用依赖注入。为每个测试用例创建一个模拟的 classB
对象并将其传递给 a
函数,如下所示:
function a(b) {
b.methodA();
}
// test file
const b = {
methodA() {
console.log('stubbed methodA');
}
}
a(b);
这样可以更好的保证测试用例之间测试替身的隔离。
我需要为以下 A 类编写单元测试。我不想测试 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();
有没有更好的方法来实现我的目标?
谢谢!
你做得对。使用 rewire
包,设置一个模拟的 classB
对象。但是不建议用模拟的方法覆盖原型上的方法。你必须在执行完测试用例后恢复到原来的状态。否则,带有 mocked methodA
的 classB
可能会导致其他测试失败。
更好的方法是使用依赖注入。为每个测试用例创建一个模拟的 classB
对象并将其传递给 a
函数,如下所示:
function a(b) {
b.methodA();
}
// test file
const b = {
methodA() {
console.log('stubbed methodA');
}
}
a(b);
这样可以更好的保证测试用例之间测试替身的隔离。