Angular:单元测试-无法测试三级分支的代码覆盖率

时间:2019-07-06 08:23:07

标签: javascript angular unit-testing karma-jasmine

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

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

TestCase:

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值吗?

2 个答案:

答案 0 :(得分:3)

使用依赖项注入代替引用全局变量(可能不会根据运行应用程序的环境(例如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 :(得分:0)

我需要完整的代码才能更准确地理解您的问题和测试用例,您能提供一个enter image description here网址吗?

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

查看Stackblitz文档以了解更多信息。