اكتبخطأ:لا يمكن قراءة الخاصية ' ثم ' من اختبار أنغولارجس-غرونت غير معروف

StackOverflow https://stackoverflow.com//questions/24036867

سؤال

أنا باستخدام خدمة q ف لإجراء مكالمات غير متزامنة.لا أستطيع حل ' ثم ' و 'تأجيل' في اختبارات وحدة باستخدام الكرمة.

أدناه هو رمز وحدة التحكم الخاصة بي.

scope.filterUrls = [{url:'page1'}, {url: 'page2'}, {url:'page-error'}];

scope.bindFilters = function () {
angular.forEach(scope.filterUrls, function (data) {
    scope.getFilterData(data.url, '').then(function (result) {
      if (data.url === 'page1') {
        scope.moduleData.index = result.data;
      } else if (data.url === 'page2') {
        scope.moduleData.page2 = result.data;
      } 
     });
  });
}

scope.getFilterData = function (filterUrls, params) {
  // $q service object
  var deferred = q.defer();

  // regular ajax request
  http({
    method: 'GET',
    url: app.api.root + filterUrls,
    params: params
  })
      .success(function (result) {
        // promise resolve
        deferred.resolve(result);
      })
      .error(function (result) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
        deferred.reject('Erreur request : ' + result);
      });
  return deferred.promise;
};

مواصفات الاختبار:

it('should call getFilterData() in bindFilters()', function () {
    spyOn(scope, 'getFilterData');
    scope.bindFilters();
    expect(scope.getFilterData).toHaveBeenCalled();
  });

أتلقى خطأ يسمى " خطأ في الكتابة:لا يمكن قراءة خاصية " ثم "غير محددة".

كيف يمكنني كتابة اختبار وحدة لهاتين الطريقتين باستخدام الكرمة.

تحديث:

1.كيف يمكننا اختبار النجاح والخطأ في النطاق.جيتفيلترداتا()

2 .ثم تعمل في النطاق.بيندفيلترز () وظيفة.

الرجاء المساعدة..

هل كانت مفيدة؟

المحلول

إذا كنت فقط تحتاج إلى معرفة ما إذا كان getFilterData يسمى أم لا, ، حاول إرجاع وعد مزيف عن طريق تزوير الوظيفة:

مع الياسمين 1.3 ، يمكننا استخدام andCallFake:

it('should call getFilterData() in bindFilters()', function () {
    spyOn(scope, 'getFilterData').andCallFake(function(){//replace with a fake function
        var deferred = $q.defer(); //assume that you already inject $q service in beforeEach and save it as a variable.
        return deferred.promise; //returns a fake promise
    });
    scope.bindFilters();
    expect(scope.getFilterData).toHaveBeenCalled();
  });

مع الياسمين 2.0 ، يمكننا استخدام and.callFake بدلا من ذلك.

حل آخر هو استخدام andReturnValue و $q.when():

it('should call getFilterData() in bindFilters()', function () {
        spyOn(scope, 'getFilterData').andReturnValue($q.when());
        scope.bindFilters();
        expect(scope.getFilterData).toHaveBeenCalled();
      });

مع الياسمين 2.0 ، يمكننا استخدام and.returnValue بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top