Typescript 间谍和茉莉一起工作,但不是开玩笑
我正在为Vue组件编写测试。这些组件导入一个const函数,如下所示:Typescript 间谍和茉莉一起工作,但不是开玩笑,typescript,unit-testing,vue.js,jasmine,jestjs,Typescript,Unit Testing,Vue.js,Jasmine,Jestjs,我正在为Vue组件编写测试。这些组件导入一个const函数,如下所示: 从“@/store/overview module”导入{overview module}` 我有访问此常量的方法,例如: private sort(){ 常数过滤器选项={ 包含:概览模块.filter.contains, 描述:!overviewModule.filter.desc }; 返回概览模块。更新概览(过滤器选项); } 当我编写测试时,我想模拟概览模块。我可以用JasminespyOn实现这一点,但我不能
从“@/store/overview module”导入{overview module}`
我有访问此常量的方法,例如:
private sort(){
常数过滤器选项={
包含:概览模块.filter.contains,
描述:!overviewModule.filter.desc
};
返回概览模块。更新概览(过滤器选项);
}
当我编写测试时,我想模拟概览模块
。我可以用JasminespyOn
实现这一点,但我不能用jest.spyOn
实现这一点
下面是一个简单的Jasmine测试用例(测试通过了):
it(“调用排序事件时对子代进行排序”,()=>{
//安排
const overviewModuleSpy=spyOn(overviewModule,“updateOverview”);
overviewModule.filter.contains=“测试”;
overviewModule.filter.desc=假;
const wrapper=shallowMount(TableOverview,{});
//表演
wrapper.find(“.ic wissensportal sort desc”).trigger(“click”);
//断言
expect(overviewModuleSpy).tohaveEncalledWith({contains:“test”,desc:true});
});
下面是一个与Jest相同的测试用例(测试未通过):
it(“调用排序事件时对子代进行排序”,()=>{
//安排
const overviewModuleSpy=jest.spyOn(overviewModule,“updateOverview”);
overviewModule.filter.contains=“测试”;
overviewModule.filter.desc=假;
const wrapper=shallowMount(TableOverview,{});
//表演
wrapper.find(“.ic wissensportal sort desc”).trigger(“click”);
//断言
expect(overviewModuleSpy).tohaveEncalledWith({contains:“test”,desc:true});
});
如果jest.spyOn
没有通过测试,测试是什么
我想我错过了一些玩笑的概念
编辑
下面是使用jest.spyOn时出现的错误:
编辑:
该问题已在有关corss污染的评论中提到。方法updateOverview
被调用了两次。在部件的安装循环中以及在规范触发事件中的第二次:
第一个调用:const wrapper=shallowMount(TableOverview,{});
第二个调用:expect(overviewModuleSpy).tohaveEncalledWith({contains:“test”,desc:true})
不幸的是,我还没有弄清楚如何清除被监视对象的状态,以便我的触发器(“click”)
具有对象的全新状态
使用jest.clearAllMocks()代码>常量包装后=shallowMount(TableOverview,{});也没用
因此,我的初步设想是:
@Component
export default class TableOverview extends Vue {
private mounted() {
overviewModule.updateOverview({}); // first
}
private sort() {
const filterOptions = {
contains: overviewModule.filter.contains,
desc: !overviewModule.filter.desc
};
return overviewModule.updateOverview(filterOptions); // second
}
}
it("sorts ascendent when sort event is called", () => {
// Arrange
const updateOverviewSpy = spyOn(overviewModule, "updateOverview");
overviewModule.filter.contains = "test";
overviewModule.filter.desc = true;
const wrapper = shallowMount(TableOverview, {}); // first call -> calls mounted()
jest.clearAllMocks(); // doesn't help
// Act
wrapper.find(".ic-wissensportal-sort-asc").trigger("click"); // second call
// Assert
expect(updateOverviewSpy).toHaveBeenCalledWith({ contains: "test", desc: false });
expect(updateOverviewSpy).toHaveBeenCalledTimes(1);
});
“不通过”是什么意思?请列出错误。间谍可以正常工作并显示发生了什么。由于您指定了overviewModule.filter值,它可能会在组件中的某个位置发生更改,并且出于某种原因,updateOverview会被调用两次。不,你不会错过一个特定于玩笑的概念。这个问题缺乏答案。很明显,那里发生了一些没有表现出来的事情,而这个“事情”在茉莉花和笑话中有所不同。对于初学者,您可以修改overviewModule,并且可能不会在测试后重置它。这可能会导致测试交叉污染。@EstusFlask我理解,我将对此进行分析,但现在似乎这个对象在任何地方都没有改变。我将更深入地看一看。由于对象属于状态,因此可以在涉及状态的任何地方对其进行修改。另一个可能的原因是当@/store/overview module
在不同的位置引用不同的模块副本时,模块重复,但在这里可以忽略它,它显然是应用程序和测试中的同一个模块,因为调用了updateOverview。我建议注意交叉污染。对于涉及全局状态的每个测试,您应该执行jest.resetModules并使用require
在本地重新导入相关模块,或者在使用全局状态的任何地方都使用jest.isolateModules。仍不清楚为什么会有2个调用。请提供完整的TableOverview组件或可以重现问题的简化版本。如果商店中的某个地方修改了过滤器
,请同时提供商店代码。这可能足以知道发生了什么。“不通过”是什么意思?请列出错误。间谍可以正常工作并显示发生了什么。由于您指定了overviewModule.filter值,它可能会在组件中的某个位置发生更改,并且出于某种原因,updateOverview会被调用两次。不,你不会错过一个特定于玩笑的概念。这个问题缺乏答案。很明显,那里发生了一些没有表现出来的事情,而这个“事情”在茉莉花和笑话中有所不同。对于初学者,您可以修改overviewModule,并且可能不会在测试后重置它。这可能会导致测试交叉污染。@EstusFlask我理解,我将对此进行分析,但现在似乎这个对象在任何地方都没有改变。我将更深入地看一看。由于对象属于状态,因此可以在涉及状态的任何地方对其进行修改。另一个可能的原因是当@/store/overview module
在不同的位置引用不同的模块副本时,模块重复,但在这里可以忽略它,它显然是应用程序和测试中的同一个模块,因为调用了updateOverview。我建议注意交叉污染。对于涉及全局状态的每个测试,您应该执行jest.resetModules并使用require
在本地重新导入相关模块,或者在使用全局状态的任何地方都使用jest.isolateModules。仍不清楚为什么会有2个调用。请提供完整的TableOverview组件或可以重现问题的简化版本。如果商店中的某个地方修改了过滤器
,请同时提供商店代码。这可能足以知道发生了什么