Javascript 我应该测试Vue.js私有函数吗?

Javascript 我应该测试Vue.js私有函数吗?,javascript,unit-testing,vue.js,vs-unit-testing-framework,Javascript,Unit Testing,Vue.js,Vs Unit Testing Framework,因此,在阅读并观看了Vue.js提供的内容后,我决定只测试组件的行为。但我可能误解了这个概念。以下是组件: 跳过上载 导出默认值{ 数据:()=>({ 上载扫描对话框:false, }), 方法:{ //这里的公共功能将被测试 skipScan(){ hideDialog(); triggerSkipScan(); }, }, } //正如vue.js所建议的,这里的私有函数 函数hideDialog(){ this.uploadScanningDialog=false; } .... 我想

因此,在阅读并观看了Vue.js提供的内容后,我决定只测试组件的行为。但我可能误解了这个概念。以下是组件:


跳过上载
导出默认值{
数据:()=>({
上载扫描对话框:false,
}),
方法:{
//这里的公共功能将被测试
skipScan(){
hideDialog();
triggerSkipScan();
},
},
}
//正如vue.js所建议的,这里的私有函数
函数hideDialog(){
this.uploadScanningDialog=false;
}
....
我想测试一下这种行为:

it('should hide itself and show next dialog when Scan Button is clicked', () => {
    const data = {
      uploadScanningDialog: true,
    };
    wrapper.setData(data);

    expect(wrapper.vm.uploadScanningDialog).toBeTruthy();
    wrapper.find('.a').trigger('click');
    expect(wrapper.vm.uploadScanningDialog).toBeFalsy();
  });
以下是问题和错误:

  • 我应该通过触发操作而不是调用方法本身来进行这种测试吗?因为我过去常常通过调用该方法并期望得到一些结果来进行测试,而不是触发调用该方法的组件

  • 我不应该测试私有函数吗?因为我的测试试图调用real方法,所以我共享的测试会出错。我会嘲笑他们,但我不知道如何继续


  • 通常,如果可能,最好通过其公共api对代码进行单元测试。

    这提高了可维护性,如:

    • 它允许您重构任何私有函数,而无需更新单元测试
    • 如果您对私有函数进行了更改,那么可以通过对公共api运行单元测试来断言您没有破坏任何东西
    是否通过调用公共方法或触发DOM事件来运行单元测试是一个选择问题


    后者提供了更大的测试覆盖率,因为如果您已经在模板中正确地将事件连接到事件处理程序函数,那么您也在进行测试;但它的可维护性稍差,就好像您更改了模板,可能需要更新测试一样。

    1。对2.不。你应该只模拟协作者,而不是你声称要测试的组件的一部分。@jornsharpe你的意思是,我也应该测试我的私有函数,比如“hideDialog”?我回答“我不应该测试私有函数吗?”时说“不”。Private意味着Private。那么我应该嘲笑我所有的私有函数,比如hideDialog吗?因为我的测试失败了,因为它们的实际实现被调用了。你不应该模拟你想要测试的任何函数——你应该针对这些私有函数的实际实现运行测试,但不应该直接调用私有函数。您应该通过您的公共api测试私有函数,并且您发布的测试似乎正确地完成了这一点。