Angular 单元测试 mockbackend SPEC 没有期望
Posted
技术标签:
【中文标题】Angular 单元测试 mockbackend SPEC 没有期望【英文标题】:Angular unit test mockbackend SPEC HAS NO EXPECTATIONS 【发布时间】:2017-06-28 00:13:39 【问题描述】:我正在使用 Jasmine 和 Karma 对 angular app 进行单元测试。我写过这样的单元测试
it('should match request object', inject([UserService, MockBackend], (userService: UserService, mockBackend) =>
mockBackend.connections.subscribe((connection: MockConnection) =>
expect(connection.request.method).toEqual(RequestMethod.Post);
expect(connection.request.json().getUserProfileRequest).toEqual(
userid: '1234',
);
connection.mockRespond(new Response(new ResponseOptions(
body: UsersMockData.GET_USER_PROFILE,
)));
);
usersService.getUserProfile(1234)
.subscribe(data =>
expect(data).toBe(UsersMockData.GET_USER_PROFILE);
);
));
当我将测试用例分成两个单独的测试用例时,一切正常,现在没有问题,我编写这样的代码
it('Check userProfile request', inject([UserService, MockBackend], (userService: UserService, mockBackend) =>
mockBackend.connections.subscribe((connection: MockConnection) =>
expect(connection.request.method).toEqual(RequestMethod.Post);
expect(connection.request.json()getUserProfileRequest).toEqual(
userid: '1234',
);
);
));
it('check return data from service', inject([UserService, MockBackend], (userService: UserService, mockBackend) =>
connection.mockRespond(new Response(new ResponseOptions(
body: UsersMockData.GET_USER_PROFILE,
)));
usersService.getUserProfile(1234)
.subscribe(data =>
expect(data).toBe(UsersMockData.GET_USER_PROFILE);
);
));
这两个测试用例都有 expect 语句,但是当我执行测试用例时,我看到两个测试用例的消息 SPEC HAS NO EXPECTATIONS。我想知道为什么它显示规范没有期望。
【问题讨论】:
因为如果你不订阅 getUserProfile 后端永远不会被调用,如果你不提供来自后端的模拟响应,那么你的订阅就没有事件。 @jonrsharpe 我错过了一段将获取模拟数据和更新代码的代码。你能更彻底地表达你想说什么吗? 您的第二个测试将失败,因为模拟后端订阅之外的连接是什么?你为什么要把它分开? @jonrsharpe 拆分以使其更具可读性,而不是在单个用例中测试所有逻辑 【参考方案1】:如果你不 .subscribe
给你的方法,get 请求将永远不会发出,因此永远不会调用模拟后端。如果您不提供模拟响应,则对您的方法的订阅将永远不会收到值。因此,要完全达到预期,您必须在每次测试中进行一定数量的最少接线。在你的情况下:
it('Check userProfile request', inject([UserService, MockBackend], (userService: UserService, mockBackend) =>
mockBackend.connections.subscribe((connection: MockConnection) =>
expect(connection.request.method).toEqual(RequestMethod.Post);
expect(connection.request.json().getUserProfileRequest).toEqual(
userid: '1234',
);
);
usersService.getUserProfile(1234).subscribe(data => );
));
it('check return data from service', inject([UserService, MockBackend], (userService: UserService, mockBackend) =>
mockBackend.connections.subscribe((connection: MockConnection) =>
connection.mockRespond(new Response(new ResponseOptions(
body: UsersMockData.GET_USER_PROFILE,
)));
);
usersService.getUserProfile(1234)
.subscribe(data =>
expect(data).toBe(UsersMockData.GET_USER_PROFILE);
);
));
【讨论】:
以上是关于Angular 单元测试 mockbackend SPEC 没有期望的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Angular 2 MockBackend 检查 RequestMethod 的方法类型