Angular5 TestBed useValue似乎没有注入相同的对象实例

Dar*_*rio 6 unit-testing angular angular5

在编写单元测试时,我遇到了一个奇怪的案例,我不知道问题出在哪里。

我已经准备了用于复制的短代码:

TestInjectable-简单的可注入类

@Injectable()
class TestInjectable {
  testProperty = 'testValue';
}
Run Code Online (Sandbox Code Playgroud)

TestComponent-使用TestInjectable的小组件

@Component({
  providers: [TestInjectable],
  template: ''
})
class TestComponent {
  constructor(private injectable: TestInjectable) {
  }

  doTest() {
    return this.injectable.testProperty;
  }
}
Run Code Online (Sandbox Code Playgroud)

单元测试

describe('Test TestComponent', () => {
  beforeEach(async(() => {
    let testInjectableMock: TestInjectable = new TestInjectable();
    testInjectableMock.testProperty = 'valueInMock';

    TestBed.configureTestingModule({
      providers: [{provide: TestInjectable, useValue: testInjectableMock}],
      declarations: [TestComponent]
    }).compileComponents();
  }));

  it('should do something', () => {
    let fixture: ComponentFixture<TestComponent> = TestBed.createComponent(TestComponent);
    let component: TestComponent = fixture.componentInstance;

    expect(component.doTest()).toBe('valueInMock');
  });
});
Run Code Online (Sandbox Code Playgroud)

由于必须testInjectableMock设置,因此valueInMock我希望该组件将返回此值。问题在于该组件正在返回testValue默认值,并且测试失败并显示以下内容:

预期“ testValue”为“ valueInMock”。

听起来好像TestBed正在创建的另一个实例,TestInjectable即使我使用useValueproperty 提供了实例。

providers: [{provide: TestInjectable, useValue: testInjectableMock}]
Run Code Online (Sandbox Code Playgroud)

有谁知道我是否错过了某些东西,或者抓住的地方以及如何说服TestBed使用模拟实例?

mrn*_*ver 5

Angular DI 克隆useValue了它提供的对象,并且从它的外观来看,它是否不正确:

https://github.com/angular/angular/issues/10788

您应该改用工厂:

TestBed.configureTestingModule({
  providers: [{provide: TestInjectable, /*-->*/ useFactory: () => testInjectableMock}],
  declarations: [TestComponent]
}).compileComponents();
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚在 Angular 11 中遇到了这个问题。尽管 10788 应该被修复,但我不得不使用 `useFactory` (2认同)