如何使用Apollo和Angular创建单元测试

如何使用Apollo和Angular创建单元测试,angular,unit-testing,apollo,Angular,Unit Testing,Apollo,我正在启动Angular 5项目,它为我的组件和服务自动生成了一些规范单元测试。对于那些需要Apollo的组件,我得到一个错误NullInjectorError:Apollo没有提供程序 我将阿波罗模块添加到导入和声明部分,如下所示: beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ ContractsDashboardComponent, Apollo ] }

我正在启动Angular 5项目,它为我的组件和服务自动生成了一些规范单元测试。对于那些需要Apollo的组件,我得到一个错误
NullInjectorError:Apollo没有提供程序

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

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ ContractsDashboardComponent, Apollo ]
    })
    .compileComponents();
  }));
但是现在我得到了错误

失败:模块'DynamicTestModule'声明的意外值'Apollo'。请添加@Pipe/@Directive/@组件注释。


在普通应用程序中,我有一个模块
GraphQLModule
,它在构造函数中调用
apollo.create
。我是否也应该嘲笑它?

如果阿波罗是一个模块,那么你应该导入它

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [ Apollo ],
      declarations: [ ContractsDashboardComponent ]
    })
    .compileComponents();
  }));
如果它不是一个模块,那么它应该是一个提供者,因此您需要提供它:

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      providers: [ Apollo ],
      declarations: [ ContractsDashboardComponent ]
    })
    .compileComponents();
  }));
因为很明显,它不是一个组件(错误要求它有一个组件装饰器),但是您将它放入声明中


因为您的第一个错误是
NullInjectorError:Apollo没有提供程序,我想Apollo是一个您注入到组件中的服务,所以您应该使用第二种方法,并提供

因此,我将Apollo模块添加到提供程序中,这似乎消除了一个错误-但是现在我得到了
StaticInjectorError[AuthService]:NullInjectorError:AuthService没有提供程序我假设路由验证卫士需要它。我也试着将其添加到声明中,但没有成功。这是一个简单的解决方案,还是我应该阅读更多关于角度测试依赖注入的内容?不,这意味着您的构造函数中有一个注入,即
私有authService:authService
。要解决此错误,您需要通过将身份验证服务添加到提供程序列表来提供身份验证服务。但既然你不是在测试它,你应该嘲笑它。要模拟它,请将其添加到提供程序:
{provide:AuthService,useValue:myMock}
。现在让我们假设您的服务只有一个函数
auth()
:然后
myMock={auth:()=>XXX}
,其中XXX的类型必须与
auth()
的结果相同。如果不止一个函数,那么必须将所有其他函数/变量添加到myMock。