【问题标题】:How to mock third party components that are not constructor dependency?如何模拟不是构造函数依赖的第三方组件?
【发布时间】:2019-06-28 12:09:04
【问题描述】:
export class ComponentDetailsComponent implements OnInit {   
    @ViewChild('treeGridReference') treeGrid: jqxTreeGridComponent;
....more code....
  this.treeGrid.clearSelection();// how do I mock this?
}

如果它是一个构造函数依赖项,我可以使用空的clearSelection 方法为jqxTreeGridComponent 创建一个存根,类似于:

class jqxTreeGridComponentStub{
  clearSelection(){}
  }
}
{ provide: jqxTreeGridComponent, useClass: jqxTreeGridComponentStub },

【问题讨论】:

标签: javascript angular typescript unit-testing jasmine


【解决方案1】:

您可以在配置测试模块的声明数组中提供一个模拟组件,

@Component({selector: 'jqxTreeGridComponent-selector', template: ''})
class jqxTreeGridComponent{
   clearSelection(){}
}

describe('', () => {
    beforeEach(async(() => {
            TestBed.configureTestingModule({
                declarations: [ ComponentDetailsComponent , jqxTreeGridComponent],
            }).compileComponents();
        }));
    })
}

要了解更多关于存根组件的信息,请阅读文档中的here

【讨论】:

  • 这并不能确保提供的组件是父组件内的变量(尽管使用测试平台可能会)。此外,这可以防止模拟,这意味着您提供实际组件,这在单元测试中是一种不好的做法
  • 您不只是测试一个类,而是一个组件,它还包含您的模板,View child 将使用您提供的存根组件创建变量。这是您在测试时添加 Shallow 组件的方式。有两种方法可以做到这一点,并在文档中提到。 angular.io/guide/testing#stubbing-unneeded-components如果可以选择,不要只投反对票。
  • 如果您只查看提供的代码,您假设他正在测试模板。没有任何说明使用了测试台。通常,模板是通过 e2e 测试而不是单元测试来测试的。您的解决方案假设了太多事情,并且仅适用于特定场景。我没有说你错,不要误会我的话!我是说您的答案对于提供的代码数量太少来说太具体了。
  • 好吧,他在问题中添加了单元测试标签。在没有 TestBed 的情况下编写单元测试,祝你好运。同样在文档中,如果您正在与子组件交互,则提到此方法是一个不错的选择。 存根组件方法还有另一个优点。虽然本例中的存根是空的,但如果您的测试需要以某种方式与它们交互,您可以为它们提供精简的模板和类。
  • 酷,我假设他正在使用 TestBed,大多数 Angular 开发人员都在使用。好吧,在那种情况下它仍然是一个替代方案。
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2019-06-15
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多