Karma - ChangeDetectorRef detectChanges mocking

时间:2017-07-20 07:57:36

标签: angular karma-jasmine

我的测试中遇到了cdr.detectChanges()的问题。我在调用它时发生了错误,我没有任何信息,我只是得到了这个错误:

  

ZoneAwareError @ webpack:///~/zone.js/dist/zone.js:923:0< -   配置/果报shim.js:108645:28       invokeTask @ webpack:///~/zone.js/dist/zone.js:398:0< - config / karma-shim.js:108120:36       onInvokeTask @ webpack:///~/zone.js/dist/proxy.js:103:0< - config / karma-shim.js:107642:49

有没有办法让detectChanges工作?

我还尝试通过在我的测试组件配置中定义cdr来使detectChanges不做任何事来尝试其他方法:

cdr = {
  detectChanges: () => {}
}

然后在提供者{ provide: ChangeDetectorRef, useValue: cdr }中,但是当我在console.info中测试的方法中的cdr时,似乎我仍然拥有原始的cdr类。

我也尝试过这样定义的假类:

class FakeCDR {
  detectChanges(): void {

  }
}

然后是提供商中的{ provide: ChangeDetectorRef, useClass: FakeCDR },但这里也一样。

这是我的测试代码:

it('should create an user', fakeAsync(inject([MockBackend],
  (backend: MockBackend) => {
    fixture.detectChanges()
    tick()

    component.newUser = User.newUserDraft()
    component.newUser.email = "email@gmail.com"
    component.createUser()
    tick()

    expect(component.newUser.email).toBe(User.newUserDraft().email)
  })))

并且在createUser中它正在做一个service.createUser然后做一些东西然后cdr.detectChanges()。我确实把console.info放在了每一行,所以我确定它在detectChanges上失败了。

1 个答案:

答案 0 :(得分:0)

首先要考虑的因素:

  1. $http(req).then(function(result) { $cookieStore.put('XSRF-TOKEN', result.data.session); }, function(error) { console.log(error); } ); ... ... if ($cookieStore.get('XSRF-TOKEN') == null || $cookieStore.get('XSRF-TOKEN') == "") { rejection.status = 403; } 不是通过DI提供的,因此您不能提供双精度货币。
  2. ChangeDetectorRef与提供的组件不同,因此您不能使用它。
  3. fixture.changeDetectorRef将在每次调用时创建私有类fixture.debugElement.injector.get(ChangeDetectorRef)(公共类ViewRef只是ViewRef的别名)的新实例,然后提供给组件的对象是另一个。

所以我的解决方法是:

ViewRef$1