unit-testing - 如何在每个测试中以不同方式模拟克隆的导入依赖项
问题描述
我有一个导入另一个文件的文件。我想在每个测试中以不同的方式模拟另一个导入,但通过导入它的文件显示它。
我通过谷歌搜索尝试了各种模拟和导入方法,但都没有奏效。
考虑文件:
设置.js
export default { mySetting: null };
store.js
import settings from "./settings";
export default {
settings: { ...settings },
};
settingsDemo.js
import store from "./store";
it("default settings", () => {
expect(store.settings.mySetting).toBe(null);
});
it("mocked to true", () => {
expect(store.settings.mySetting).toBe(true);
});
it("mocked to false", () => {
expect(store.settings.mySetting).toBe(false);
});
我如何在其中模拟这些文件settingsDemo.js
以使所有 3 个测试都通过而不进行编辑settings.js
或store.js
?
注意:这与我之前的问题类似,但是在这种情况下,导入依赖项和更改值的解决方案不起作用,因为这里store
没有引用settings
对象,而是将其克隆为初始值。
解决方案
同样的原则也适用:“虽然您不能更改导入的值,但您可以更改它们所指的对象。”
在这种情况下store
,是一个包含嵌套对象的settings
对象。虽然不可能简单地分配store
给其他东西,但可以分配store.settings
给其他东西。也可以设置store.settings.mySetting
为其他内容:
import store from "./store";
it("default settings", () => {
expect(store.settings.mySetting).toBe(null); // SUCCESS
});
it("mocked to true", () => {
store.settings = { mySetting: true }; // set store.settings to something else
expect(store.settings.mySetting).toBe(true); // SUCCESS
});
it("mocked to false", () => {
store.settings.mySetting = false; // set store.settings.mySetting to something else
expect(store.settings.mySetting).toBe(false); // SUCCESS
});
推荐阅读
- django - 如何在 Django v3 中正确编写自定义用户模型和管理器?
- apollo - apollo 链接在 400 错误上重试的意外行为
- java - 对同一对象的多次引用
- rust - 从parking_lot::RwLock 返回映射数据
- php - 试图将数据传输到数据库但它们从 utf-8 变为 somting else
- azure-devops - 有没有办法将 gitignore 模板添加到 azure devops 中的新项目?
- excel - 搜索以连接列并在从另一个工作簿中选择额外数量之间,该数量应增加
- javascript - react-native-webrtc 远程流在 android 5.0.2 上不起作用
- sql - 如何提取SAS PROC SQL passthru中的记录,按日期过滤,但日期是字符串格式?
- javascript - 如何为每个 wordpress 帖子点击创建单独的弹出表单