angular - 检查后表达式已更改,在使用 jasmine 测试 angular 2 组件时出错

标签 angular typescript jasmine karma-jasmine

我在测试从服务接收可观察对象的组件时遇到错误,我试图在规范中模拟该行为,但我收到以下错误:表达式在检查后已更改,之前的值 ' ',当前值:[对象对象]。你能帮我解决这个问题吗?我的规范文件如下:

import { ManualProcessService } from '../../services/manual-process.service';
import { ManualProcessComponent } from './manual-process.component';
import { MANUALPROCESSMOCKDATA } from '../../shared/mocks/mock-manualprocessdata';
import {DataTableModule, SharedModule, DropdownModule as PrimeNgDropDownModule, CheckboxModule, InputTextModule} from 'primeng/primeng';
import {MenuModule} from 'primeng/components/menu/menu';
import {DropdownModule} from 'ng2-bootstrap';
import { PopoverModule } from 'ng2-popover';
import {Observable} from 'rxjs/Observable';
import { IManualProcessData} from '../../models/manual-process.model';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {
  async,
  TestBed,
  fakeAsync,
  tick,
} from '@angular/core/testing';

class MockManualProcessService {

  getManualProcessData(): Observable<IManualProcessData> {
      return Observable.of(MANUALPROCESSMOCKDATA);
  }
}

describe('Testing Manual Process Component', () => {

  let fixture,
  event = {
    first: 0,
    rows: 10
  }, 
  manualProcessService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        ManualProcessComponent
      ],
      providers: [
        { provide: ManualProcessService, useClass: MockManualProcessService }
      ],
      imports: [
        FormsModule, 
        ReactiveFormsModule,
        DataTableModule,
        SharedModule,
        PopoverModule,
        PrimeNgDropDownModule,
        DropdownModule.forRoot(),
        CheckboxModule,
        InputTextModule,
        MenuModule
    ],
    });
    fixture = TestBed.createComponent(ManualProcessComponent);
    manualProcessService = TestBed.get(ManualProcessService);
    spyOn(manualProcessService, 'getManualProcessData').and.returnValue(Observable.of(MANUALPROCESSMOCKDATA));
    fixture.detectChanges();
  });

  it('Filters should be reset', (done) => {
    fixture.componentInstance.clearFilters()
    fixture.detectChanges();
    expect(fixture.componentInstance.filterBy.length).toBe(0);
    done();
  })


  it('Should load list of manual process files', fakeAsync(() => {
    fixture.componentInstance.loadData(event);
    tick();
    fixture.detectChanges();
    expect(fixture.componentInstance.filterBy.length).toBe(10);
  }));
});

我是 Angular 2 和单元测试的新手。有人可以指导,我做错了什么。

最佳答案

我也遇到了这个问题,并更改了我的测试以直接针对组件的 ngOnInit() 方法。所以,而不是

fixture.detectChanges();

在你的测试中,你可以尝试

fixture.componentInstance.ngOnInit();

(或任何生命周期 Hook 是您组件的入口点)。那对我有用。即使组件本身运行良好,它也能使我免于失败的测试。

关于angular - 检查后表达式已更改,在使用 jasmine 测试 angular 2 组件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42383117/

相关文章:

angular - 如何使用 docker-compose 运行 Angular?

使用 Jasmine 和 Sinon 测试主干模型 - 对象 #<Object> 没有方法 'spy'

javascript - TS4060 : Return type of exported function has or is using private name 'class'

javascript - typescript 中两个日期之间的天数列表

angularjs - 如何使用 Jasmine 监视 Controller 方法?

javascript - 类型错误 primeFactors.for 不是函数

javascript - 在 Angular 2 模板中传递变量

angular - NgModel内部如何工作(初始设置值)

cordova - Angular 学 : Google Analytics track full URI including anchor

Angular 2 让它等待服务初始化