【问题标题】:Angular: Unit Testing - Not able to test Ternary branch for code coverageAngular:单元测试 - 无法测试三元分支的代码覆盖率
【发布时间】:2019-07-06 08:23:07
【问题描述】:

我正在尝试测试使用window.location 的三元分支。

@Injectable()
export class ABCService {
  private hostUrl = (window.location.host.indexOf('localhost') > -1) ? 'example.com' : window.location.host;
...

测试用例:

it('check alternate URL', () => {
        const URL = 'http://example.org/postMethod';
        service.getData().subscribe(data => {
            expect(data.length).toBe(1);
        });
        const req = httpMock.expectOne(URL);
        expect(req.request.url).toBe(URL);
        req.flush({data:[1]});
    });

得到错误:

   Error: Expected one matching request for criteria "Match URL: http://example.org/postMethod", found none.

关于如何测试window.location.host 是否不是本地主机的任何想法。 试过(window as any).location = { ...window.location, host: 'http://example.org' }; 仍然得到主机 == localhost:9876; 有什么办法可以覆盖 window.location.host 的模拟值吗?

【问题讨论】:

    标签: javascript angular unit-testing karma-jasmine


    【解决方案1】:

    使用依赖注入,而不是引用一个全局变量,它可能不会根据您运行应用的环境(例如 Angular Universal)来定义。

    在这种情况下,您可以从 Angular 的 DOCUMENT 常量 (https://angular.io/api/common/DOCUMENT) 中获取所需的信息。

    constructor(@Inject(DOCUMENT) private doc) {
      console.log(this.doc.location.href);
    }
    

    在您的测试中,您可以模拟它:

    const service = new ABCService({location: {href: 'my-test-url'}} as any);
    

    【讨论】:

    • +1 了解测试的工作原理。仅仅通过强迫你使其可测试来阻止你做一些不好的做法。 :)
    【解决方案2】:

    我需要完整的代码来更准确地理解你的问题和测试用例,你能提供一个Stackblitz url吗?

    无论如何,您可以使用 jasmine 的 spyOn 函数来模拟 window.location。这样您就可以提供模拟它的函数及其返回值,而无需实际设置主机。

    查看Jasmine 文档了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多