我正在尝试测试使用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
值吗?
答案 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)
我需要完整的代码才能更准确地理解您的问题和测试用例,您能提供一个网址吗?
无论如何,您可以使用茉莉花的spyOn
函数来模拟window.location。这样,您可以提供模拟它的功能及其返回值,而无需实际设置主机。
查看Stackblitz文档以了解更多信息。