Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 间谍和茉莉一起工作,但不是开玩笑_Typescript_Unit Testing_Vue.js_Jasmine_Jestjs - Fatal编程技术网

Typescript 间谍和茉莉一起工作,但不是开玩笑

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实现这一点,但我不能

我正在为Vue组件编写测试。这些组件导入一个const函数,如下所示:

从“@/store/overview module”导入{overview module}`
我有访问此常量的方法,例如:

private sort(){
常数过滤器选项={
包含:概览模块.filter.contains,
描述:!overviewModule.filter.desc
};
返回概览模块。更新概览(过滤器选项);
}
当我编写测试时,我想模拟
概览模块
。我可以用Jasmine
spyOn
实现这一点,但我不能用
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组件或可以重现问题的简化版本。如果商店中的某个地方修改了
过滤器
,请同时提供商店代码。这可能足以知道发生了什么