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 的方法类型

Angular 4 单元测试(TestBed)非常慢

Angular:单元测试路由:预期 '' 是 '/route'

Angular - 组件中订阅功能的单元测试

angular2 使用主机组件进行单元测试

Angular 2 单元测试组件,模拟 ContentChildren