मेरे पास एक सेवा है जो डेटा-स्टोर के रूप में कार्य करती है। इसके कंस्ट्रक्टर में, यह डिवाइस के स्टोरेज से डेटा-सेट को "हाइड्रेट" करने का प्रयास करता है (आयनिक और इसकी 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([]);
     }

}

मुझे पता है कि जैस्मीन के साथ एसिंक्स परीक्षण कैसे लिखना है, और निजी सदस्यों/विधियों तक कैसे पहुंचना है, साथ ही मेरे वांछित परिणाम के लिए _data.getValue() की जांच करने की आवश्यकता जानने के बारे में जानना - लेकिन मेरी समस्या यह नहीं है कि परीक्षण कैसे करें:

  1. कंस्ट्रक्टर, और/या;
  2. initializeData ताकि यह वादा पूरा होने की प्रतीक्षा करे, क्योंकि इस पद्धति में कोई भी वादा वापस नहीं किया जा रहा है।

किसी भी और सभी तरह की मदद के लिए धन्यवाद!

3
EHorodyski 17 जिंदा 2019, 02:30

1 उत्तर

सबसे बढ़िया उत्तर

आदर्श रूप से आपके पास 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)
        });

    });

});
1
Jake Holzinger 17 जिंदा 2019, 03:14