【发布时间】:2016-09-24 06:38:01
【问题描述】:
我想在我的单元测试中监视一个承诺并伪造该承诺,但问题是如果我首先运行构造函数,那么他首先运行承诺然后运行 Spyon 的问题。
但是当我第一次运行 spyOn 然后构造函数时,它给出了一个错误,即存储未定义。
有人知道如何解决这个问题吗?
规格文件:
describe('Settings Service', () => {
beforeEach(() => {
settingsService = new SettingsService(); // This gives a error beceause it runs the promise
spyOn(settingsService.storage, 'get').and.callFake((key: String): Promise<string> => {
return new Promise((resolve, reject) => { resolve('url'); });
});
});
构造函数:
constructor() {
this.storage = new Storage(LocalStorage);
this.storage.get('url').then(data => {
this.setLink(data);
});
}
更新:
我也试过这个:
let injector: any = ReflectiveInjector.resolveAndCreate([SettingsService]);
settingsService = injector.get(SettingsService);
spyOn(settingsService.storage, 'get').and.callFake((key: String): Promise<string> => {
return new Promise((resolve, reject) => { resolve('https://secure.info/pascal'); });
});
【问题讨论】:
-
“简单”的第一种方法可能是注入 Storage 而不是在构造函数中创建实例。然后,您可以在调用构造函数之前模拟这个注入的存储
-
你有例子吗?
-
你将
SettingsService实现为一个角度服务,然后你将它注入你的类中:类似于static $inject = ['settingsService']; constructor(private settingsService: SettingsService) {...}然后你可以在你的测试中使用$injector.get('settingsService')和mock 获得这个服务的副本它或窥探它 -
这就是我现在拥有的
-
对不起,我想说,你应该注入
Storage
标签: unit-testing typescript angular jasmine karma-runner