我有一个充当数据存储的服务。在其构造函数中,它尝试从设备的存储中“混合”数据集(使用Ionic及其Storage
服务):
@Injectable()
export class SimpleDataStore {
private _data: BehaviorSubject<any> = new BehaviorSubject<any>(undefined);
public data: Observable<any> = this._data.asObservable();
constructor(private _http: HttpClient, private _storage) {
this.initializeData();
}
private initializeData(): void {
this._storage.get("dataKey")
.then(data => this._data.next(data))
.catch(() => this._data.next([]);
}
}
我知道如何使用Jasmine编写异步测试,以及如何访问私有成员/方法,并且知道需要检查_data.getValue()
以获得我想要的结果-但是我的问题是不知道如何进行测试:
initializeData
,以便它等待Promise完成,因为该方法中没有返回Promise。感谢所有帮助!
答案 0 :(得分:0)
理想情况下,您应该让initializeData()
返回其构造的承诺,以便您可以轻松地等待它在测试中解决。然后,无需尝试弄清楚承诺何时解决,您可以在构造类之前简单地模拟initializeData()
。
鉴于initializeData()
方法已更改为返回诺言,您可以如下测试SimpleDataStore
类:
describe('SimpleDataStore', function () {
beforeEach(function () {
this.initializeData = spyOn(SimpleDataStore.prototype, 'initializeData');
this.http = jasmine.createSpyObj('HttpClient', ['get']);
this.storage = jasmine.createSpyObj('Storage', ['get']);
this.dataStore = new SimpleDataStore(this.http, this.storage);
// initializeData is called immediately upon construction.
expect(this.initializeData).toHaveBeenCalled();
});
describe('initializeData', function () {
beforeEach(function () {
// The data store is initialized, we can now let the calls go to the real implementation.
this.initializeData.and.callThrough();
});
afterEach(function () {
expect(this.storage.get).toHaveBeenCalledWith('dataKey');
});
it('is initialized with "dataKey" storage', function (done) {
const data = {};
this.storage.get.and.returnValue(Promise.resolve(data));
this.dataStore.initializeData()
.then(() => expect(this.dataStore._data.getValue()).toBe(data))
.catch(fail)
.finally(done)
});
it('is initialized with empty array when "dataKey" storage rejects', function (done) {
this.storage.get.and.returnValue(Promise.reject());
this.dataStore.initializeData()
.then(() => expect(this.dataStore._data.getValue()).toEqual([]))
.catch(fail)
.finally(done)
});
});
});