【发布时间】:2020-12-09 14:26:14
【问题描述】:
我在类中有 2 个方法
- 方法A()
- 方法B()
代码:
const myModule1 = require('./foo');
const myModule2 = require('./bar');
const obj = {
value: 100,
text: "Hello"
};
const updatedObj = {
value: 200,
text: "Hello"
}
// Inside beforeEach block
myModule.methodA.mockReturnValue(() => obj);
myModule2.methodB.mockReturnValue(() => updatedObj);
现在 methodA 正在返回模拟对象,但我正在测试的类同时使用 methodB 和 methodA。现在 methodB 正在更新 methodA 返回的相同模拟对象,并将 obj.value 从 100 更新为 200。
如果我使用 updatedObj,下面的代码将毫无意义,因为在这种情况下,测试的意义何在。
expect(updatedObj.value).toEqual(200) ---> 这样的测试没有意义
我该如何做这样的事情: @ 987654323@ 假设我正在模拟方法B 的返回值,它更新返回相同模拟对象的相同对象。我怎样才能做到这一点?
所以基本上我想同时模拟 methodA 和 methodB 但是如何使用相同的对象而不是使用两个不同的对象是可能的吗?
【问题讨论】:
-
我不确定你在问什么。如果您单独测试
methodA或methodB,您不会嘲笑它们。如果methodA使用methodB并且您正在测试methodA,您将不会模拟methodA。如果您正在测试使用methodA和methodB的methodC,但methodB依赖于methodA的结果,则您不会模拟methodB,因为您会重复逻辑,并且会运行失去同步的风险。这是依赖副作用的危险之一,尤其是嵌套副作用。
标签: javascript unit-testing jestjs