【问题标题】:How to create unit tests with Apollo and Angular如何使用 Apollo 和 Angular 创建单元测试
【发布时间】:2018-06-19 15:04:43
【问题描述】:

我正在启动一个 Angular 5 项目,它为我的组件和服务自动生成了一些规范单元测试。对于那些需要 Apollo 的组件,我收到错误 NullInjectorError: No provider for Apollo!

我将 Apollo 模块添加到导入和声明部分,如下所示:

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ ContractsDashboardComponent, Apollo ]
    })
    .compileComponents();
  }));

但是现在我得到了错误

Failed: Unexpected value 'Apollo' declared by the module 'DynamicTestModule'. Please add a @Pipe/@Directive/@Component annotation.

在普通应用程序中,我有一个模块GraphQLModule,它在构造函数中调用apollo.create。我也应该以某种方式嘲笑它吗?

【问题讨论】:

    标签: angular unit-testing apollo


    【解决方案1】:

    如果 Apollo 是一个模块,那么你应该导入它。

      beforeEach(async(() => {
        TestBed.configureTestingModule({
          imports: [ Apollo ],
          declarations: [ ContractsDashboardComponent ]
        })
        .compileComponents();
      }));
    

    如果不是模块,应该是提供者,所以需要提供:

      beforeEach(async(() => {
        TestBed.configureTestingModule({
          providers: [ Apollo ],
          declarations: [ ContractsDashboardComponent ]
        })
        .compileComponents();
      }));
    

    因为很明显,它不是一个组件(错误要求它有一个组件装饰器),但是您将其放入声明中。

    由于您的第一个错误是 NullInjectorError: No provider for Apollo!,我猜 Apollo 是您注入到组件中的服务,因此您应该使用第二种方法,提供。

    【讨论】:

    • 所以我将 ApolloModule 添加到提供程序,这似乎已经清除了一个错误 - 但是现在我得到 StaticInjectorError[AuthService]: NullInjectorError: No provider for AuthService! 我假设路由身份验证警卫需要它。我也尝试将其添加到声明中,但没有奏效。这是一个简单的解决方法还是我应该通过角度测试阅读更多关于依赖注入的内容?
    • 不,这意味着您的构造函数中有一个注入 private authService: AuthService。要解决此错误,您需要通过将其添加到提供者列表来提供您的身份验证服务。但由于您没有对其进行测试,因此您应该模拟它。要模拟它,请将其添加到您的提供程序:{ provide: AuthService, useValue: myMock }。现在假设您的服务只有一个函数auth():然后是myMock = { auth: () => XXX },其中XXX 必须与auth() 的结果相同。如果不是只有一个函数,则必须将所有其他函数/变量添加到 myMock。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2015-10-16
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    相关资源
    最近更新 更多