开发者问题收集

在 Angular 单元测试中模拟要订阅的模拟服务的 Subject 属性

2021-01-18
3834

在我的Angular单元测试中,我的模拟服务具有两个属性:

174362330

,在我的SUT中,我在构造函数中使用它们:

595364091 < /code>

现在,我正在尝试使用以下两种方法来模拟属性:

RIHT现在我的测试看起来像:

241952887

因此,在测试中我创建:

  • 服务模拟 HubServiceMock

  • messageChange = new object();

  • gameChange = new object();

  • 我都为两个 .next

  • 运行
  • 和我设置了属性的间谍:

    spyonproperty(Hubservicemock,'MessageChange','get')。和.returnvalue(messageChange);

    spyonproperty(HubServiceMock,'gameChange','get')。和returnvalue(gameChange);

为什么它对我不起作用?我收到一个错误:

800973919
2个回答

它不起作用,因为 hubServiceMock 在其 messageChangegameChange 中没有虚假主题,您需要在调用 new SignalRService(hubServiceMock) 之前设置它们。

const hubServiceMock = jasmine.createSpyObj('HubConnectionService', [
    'isConnectionStarted',
  ]);
  const messageChange = new Subject();
  const gameChange = new Subject();

  // add this
  hubServiceMock.messageChange = messageChange;
  hubServiceMock.gameChange = gameChange;

那么它应该可以工作,可能需要进行微小的调整。


我建议在这种情况下使用模拟库以避免痛苦。

例如,使用 ng-mocks ,测试可能看起来像:

describe('SignalRService', () => {
  beforeEach(() => MockBuilder(SignalRService, ITS_MODULE));

  const hubServiceMock = {
    messageChange: new Subject(),
    gameChange: new Subject(),
  };
  beforeEach(() => MockInstance(HubConnectionService, hubServiceMock));


  it('Service_ShouldBeCreated', () => {
    const signalrService = MockRender(SignalRService).point.componentInstance;
    expect(signalrService).toBeTruthy();

    hubServiceMock.messageChange.next({});
    hubServiceMock.gameChange.next({});
    // next assertions.
  });
}
satanTime
2021-01-19

我最终采用了如下方法,即注入模拟服务:

hubServiceMock = TestBed.inject(HubConnectionService);

然后,我像这样模拟我的 Subject

it('Service_ShouldBeCreated', () => {
    spyOn(hubServiceMock.messageChange, 'next');
    spyOn(hubServiceMock.gameChange, 'next');
    expect(signalrService).toBeTruthy();
  });

在其他测试中,我可以使用如下模拟服务方法:

let spyIsConnectionStarted = spyOn(hubServiceMock, 'isConnectionStarted');
    spyIsConnectionStarted.and.returnValue(true);
bakunet
2021-01-19