اكتبخطأ:لا يمكن قراءة الخاصية ' ثم ' من اختبار أنغولارجس-غرونت غير معروف
-
21-12-2019 - |
سؤال
أنا باستخدام خدمة 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
بدلا من ذلك.