Angular 服务间谍对象上的角度单元测试组件调用

Angular 服务间谍对象上的角度单元测试组件调用,angular,jasmine,angular-test,Angular,Jasmine,Angular Test,我在我的组件中存根一个服务。现在,我想监视所有方法,而不是实际调用它们 我遵循创建spy对象并定义返回函数的: it('#getValue should return stubbed value from a spy', () => { // create `getValue` spy on an object representing the ValueService const valueServiceSpy = jasmine.createSpyObj

我在我的组件中存根一个服务。现在,我想监视所有方法,而不是实际调用它们

我遵循创建spy对象并定义返回函数的:

  it('#getValue should return stubbed value from a spy', () => {
    // create `getValue` spy on an object representing the ValueService
    const valueServiceSpy =
      jasmine.createSpyObj('ValueService', ['getValue']);

    // set the value to return when the `getValue` spy is called.
    const stubValue = 'stub value';
    valueServiceSpy.getValue.and.returnValue(stubValue);
我不想返回一个已定义的值,而是想调用这个特定的方法。我还将spy移动到beforeach,因为我想在多个测试中使用它。我不想模拟表单创建的原因是,它将是原始方法的1:1副本

规格 现在我得到了
TypeError:无法读取未定义的
的属性“valueChanges”

问题:

1) 如何通过这个创建表单的特定方法调用


2) 此调用是否需要我导入/提供服务的所有依赖项(服务构造函数)或仅此特定方法的依赖项?

我发现了几个选项:

(A)

  • 创建原始服务

  • 创建SpyObj

  • 使用原始方法重写SpyObj的表单创建方法

  • 这不是最好的方法,因为它需要将服务的所有依赖项导入测试床

    (B)

    在规范中重新定义表单方法,例如

    const generatorServiceSpy = jasmine.createSpyObj('GeneratorService', [
          'createRepository',
          'crawlRepository',
          'fillWithDummy'
        ]);
        const formBuilder = new FormBuilder();
        generatorServiceSpy.createGeneratorForm = (generator?: Generator) => {
          console.log('generator', generator);
          const generatorForm = formBuilder.group({
            url: [null]
          });
          if (generator) { generatorForm.patchValue(generator); }
          return generatorForm;
        };
    
    如果该方法的简化版本更适合于测试,那么此方法可能会有所帮助。缺点是它不是很干

    c) 这是我首选的解决方案。它将最小依赖项声明与原始功能结合起来

    beforeEach(async(() => {
        const generatorServiceSpy = jasmine.createSpyObj('GeneratorService', [
            'createRepository',
            'crawlRepository',
            'fillWithDummy'
        ]);
        const formBuilder = new FormBuilder();
        generatorServiceSpy.createGeneratorForm = GeneratorService.prototype.createReviewForm;
    
    const generatorServiceSpy = jasmine.createSpyObj('GeneratorService', [
          'createRepository',
          'crawlRepository',
          'fillWithDummy'
        ]);
        const formBuilder = new FormBuilder();
        generatorServiceSpy.createGeneratorForm = (generator?: Generator) => {
          console.log('generator', generator);
          const generatorForm = formBuilder.group({
            url: [null]
          });
          if (generator) { generatorForm.patchValue(generator); }
          return generatorForm;
        };
    
    beforeEach(async(() => {
        const generatorServiceSpy = jasmine.createSpyObj('GeneratorService', [
            'createRepository',
            'crawlRepository',
            'fillWithDummy'
        ]);
        const formBuilder = new FormBuilder();
        generatorServiceSpy.createGeneratorForm = GeneratorService.prototype.createReviewForm;