Angular 2单元测试总是在失败时通过

时间:2018-05-17 16:53:29

标签: angular unit-testing typescript jasmine karma-jasmine

我正在测试一个名为checkName()的构造函数中包含方法的服务。出于某种原因,当我尝试测试checkName()方法时,它总是成功的,即使测试应该失败。但是,如果我在构造函数中注释掉该方法,那么测试的行为就像应该然后失败一样。

以下是我对Service1的测试:

describe('Service: Service1', () => {
  let service1: Service1;
  let service2: Service2;

  beforeEach(() => {
    routerStub = {
     navigate: jasmine.createSpy('navigate')
    };
    TestBed.configureTestingModule({
          providers: [
            Service1,
            {provide: Service2, useValue: Service2Stub},
            {provide: Router, useValue: routerStub}
          ]
        });
   service1 = TestBed.get(Service1);
   service2 = TestBed.get(Service2);
  });

  it('should fail', () => {
    spyOn(service2, 'getName').and.returnValue('test');
    service1.checkName();
    expect(routerStub.navigate).toHaveBeenCalledWith(['bad-name-page']);
  });

这是Service1:

export class Service1 {
  constructor(private _service2: Service2) {
    this.checkName();
  }

  checkName(): void {
    const name = this._service2.getName();
    if (!name) {
      this._router.navigate(['bad-name-page']);
    }
  }
}

返回'测试'从spyOn(service2,' getName'),我希望测试失败,因为它只应该在未定义名称时导航到bad-name-page。我已经在' if'之前和之后添加了日志记录。声明,一切看起来正常; name填充了' test'当该名称有效时,if语句中的日志不会执行。

但是,如果我从构造函数中删除this.checkName(),则此测试会像我预期的那样失败。

为什么在构造函数中使用this.checkName()会导致我的测试出现问题以及使用构造函数方法编写测试的最佳方法是什么?

谢谢!

0 个答案:

没有答案