首页 > 解决方案 > Angular 2 单元测试在它应该失败时总是通过

问题描述

我正在测试一个服务,它的构造函数中有一个名为 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']);
  });

这是服务1:

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') 返回“test”,我希望测试失败,因为它应该只在名称未定义时导航到 bad-name-page。我在“if”语句之前和之后添加了日志记录,一切看起来都很正常;name 填充有“test”,当该名称有效时,if 语句中的日志不会执行。

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

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

谢谢!

标签: angularunit-testingtypescriptjasminekarma-jasmine

解决方案


推荐阅读