【发布时间】:2018-01-09 09:39:05
【问题描述】:
我有一个服务,它有一个检查可用浏览器配额存储并返回 Observable 的方法:
import { Injectable } from "@angular/core";
import { Observable } from "rxjs/Observable";
@Injectable()
export class StorageService {
hasAvailableStorage(): Observable<boolean> {
const nav: any = navigator;
return Observable.create(observer => {
nav.webkitTemporaryStorage.queryUsageAndQuota(
(usedBytes, grantedBytes) => {
observer.next(usedBytes <= grantedBytes * 0.8);
}
);
});
}
}
我想对该服务进行单元测试,但我不知道如何在测试中访问窗口或模拟窗口/webkitTemporaryStorage。
我尝试了以下方法,但是它给出了一个错误,即 window.webkitTemporaryStorage 是只读的并且无法分配给:
import { Injectable } from "@angular/core";
import { StorageService } from "./storage.service";
@Injectable()
class MockWebkitTemporaryStorage {
queryUsageAndQuota(cb) {
return cb(10, 15);
}
}
describe("storage.service", () => {
let service: StorageService;
const nav: any = window.navigator;
nav.webkitTemporaryStorage = MockWebkitTemporaryStorage;
beforeAll(() => {
service = new StorageService();
});
it("should return the result of hasAvailableStorage()", () => {
const result = service.hasAvailableStorage();
expect(result).toBeDefined();
});
});
我预计我最终必须在窗口导航器/queryUsageAndQuota 上使用某种间谍,但我看不出我应该如何设置或完成测试才能做到这一点。如果有人可以帮助我并详细提供一些示例,那就太好了! :)
EDIT 更改测试(在 cmets 之后):
describe("storage.service", () => {
let service: StorageService;
beforeAll(() => service = new StorageService());
it("should return the result of hasAvailableStorage()", () => {
const spy = spyOn(navigator["webkitTemporaryStorage"], "queryUsageAndQuota").and.callFake(MockWebkitTemporaryStorage);
const result = service.hasAvailableStorage();
expect(spy).toHaveBeenCalled();
expect(result).toBeDefined();
});
});
此后,测试失败并出现错误:'Expected spy queryUsageAndQuota to have been called。'
【问题讨论】:
-
快速提问:这些导航器方法是原生的,还是您正在创建它们?
-
这些是本机方法,只是在服务中调用。
标签: angular unit-testing angular5