【问题标题】:Angular testing always passing test even if it is wrongAngular 测试总是通过测试,即使它是错误的
【发布时间】:2021-10-29 23:41:23
【问题描述】:

我有这个 observable 的单元测试:

fdescribe('goToPurchases', () => {
    it('should have working NavApiService',() => {
        apiService.goToPurchases(null).subscribe((res: PurchaseResponse) => {
            expect(res.shimentId).toBe('not supposed to be valid!')
            expect(res.url).not.toBeDefined();
        });
    });

});

这是 apiService.ts 中的真实方法:

public goToPurchases(shipmentId: string): Observable<Object> {
    return this.httpClient.post(`${environmentVariables.loadInsurance.apiUrl}/v1/purchases`, {shipmentId});
}

真正的反应应该是这样的:

{
  "id": "50d4ad69-0337-4e49-8f00-5c9a152cfad0",
  "shipmentId": null,
  "userId": "41ac2d3d-b2ed-4c73-9c56-25d17a9caa7e",
  "url": "https://test.portal.loadsure.net/insureLoad/v2?id=TFMtREFULzIwMjEwODMxL3l6ZDVlYlJRejdrQkdKcUwxbk5l"
}

当我运行测试时它成功通过了吗?我做错了什么?

谢谢。

【问题讨论】:

  • 你有一个类型shimentId(缺少p),可能不是原因,但请仔细检查。
  • 您希望进行真正的 http 调用吗?我没有看到任何使用 http 模拟的尝试....

标签: angular unit-testing jasmine karma-jasmine angular-test


【解决方案1】:

通过将期望放入订阅回调中,您可以在检索到值后正确评估它。 问题是测试在等待响应之前完成。通过这种方式完成,并且由于它不评估任何东西,测试是成功的。

您需要更改测试完成的方式。

您可以使用fakeasync,这样您的测试只有在所有异步任务完成后才能完成:

import { fakeAsync } from '@angular/core/testing';

fdescribe('goToPurchases', fakeAsync(() => {
    it('should have working NavApiService',() => {
        apiService.goToPurchases(null).subscribe((res: PurchaseResponse) => {
            expect(res.shimentId).toBe('not supposed to be valid!')
            expect(res.url).not.toBeDefined();
        });
    });

}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 2020-03-01
    • 2017-01-11
    • 2014-07-24
    • 1970-01-01
    • 2016-05-31
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多