Javascript 如何模拟不是构造函数依赖项的第三方组件?

Javascript 如何模拟不是构造函数依赖项的第三方组件?,javascript,angular,typescript,unit-testing,jasmine,Javascript,Angular,Typescript,Unit Testing,Jasmine,如果它是一个构造函数依赖项,我可以用空的clearSelection方法为jqxTreeGridComponent创建一个存根,类似于: export class ComponentDetailsComponent implements OnInit { @ViewChild('treeGridReference') treeGrid: jqxTreeGridComponent; ....more code.... this.treeGrid.clearSelection();

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

export class ComponentDetailsComponent implements OnInit {   
    @ViewChild('treeGridReference') treeGrid: jqxTreeGridComponent;
....more code....
  this.treeGrid.clearSelection();// how do I mock this?
}

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

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

要了解有关存根组件的更多信息,请阅读文档。

这并不能确保提供的组件是父组件内部的变量(尽管在测试台上可能会)。此外,这可以防止模拟,这意味着您提供了实际的组件,这在单元测试中是一种不好的做法。您不仅测试一个类,还测试一个组件,而且它还包括您的模板。View child将使用您提供的存根组件创建变量。这是您在测试时添加浅层组件的方式。有两种方法可以做到这一点,文档中提到了这一点。如果是另一种选择,不要只是否决投票。如果你只看提供的代码,你就认为他在测试模板。没有任何说明使用了试验台。通常,模板是通过e2e测试而不是通过单元测试进行测试的。您的解决方案假设了太多的事情,只适合于特定的场景。我不说你错了,别误会我的话!我是说你的答案太具体了,提供的代码太少。他在问题中添加了单元测试标签。在没有测试床的情况下编写单元测试,祝你好运。文档中还提到,如果您正在与子组件交互,此方法是一个不错的选择。存根组件方法还有另一个优点。虽然本例中的存根是空的,但是如果您的测试需要以某种方式与它们交互,您可以为它们提供精简的模板和类。那么,在这种情况下,它仍然是一个替代方案。可能是这个的重复:
@Component({selector: 'jqxTreeGridComponent-selector', template: ''})
class jqxTreeGridComponent{
   clearSelection(){}
}

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