在 Angular 单元测试中模拟要订阅的模拟服务的 Subject 属性
在我的Angular单元测试中,我的模拟服务具有两个属性:
174362330
,在我的SUT中,我在构造函数中使用它们:
595364091 < /code>
现在,我正在尝试使用以下两种方法来模拟属性:
-
Angular单元测试模拟重播主题
-
如何使用茉莉花
向价值属性(而不是方法)
RIHT现在我的测试看起来像:
241952887
因此,在测试中我创建:
-
服务模拟
HubServiceMock
,
-
假
messageChange = new object();
,
-
假
gameChange = new object();
,
-
我都为两个
.next
,
运行
-
和我设置了属性的间谍:
spyonproperty(Hubservicemock,'MessageChange','get')。和.returnvalue(messageChange);
spyonproperty(HubServiceMock,'gameChange','get')。和returnvalue(gameChange);
为什么它对我不起作用?我收到一个错误:
800973919
它不起作用,因为
hubServiceMock
在其
messageChange
和
gameChange
中没有虚假主题,您需要在调用
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.
});
}
我最终采用了如下方法,即注入模拟服务:
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);