我有一些问题将我的工厂注入测试规范。我正在使用requireJS注入控制器和工厂等。
define(['controller', 'loginFactory', 'angular', 'angularMocks'],
function(ctrl, loginFactory, angular){
var scope,
OnBoardingCtrl;
describe('Controller: OnBoarding', function () {
beforeEach(angular.mock.inject(function ($rootScope, $controller, $location) {
angular.module('app');
scope = $rootScope.$new();
OnBoardingCtrl = $controller(ctrl, {
'$scope': scope,
'loginFactory': loginFactory,
});
}));
it('Should check endpoint', inject(function ($http, $httpBackend) {
var successCallback = jasmine.createSpy();
var url = 'login?un=test&pw=test';
var response = {"token":1}
$httpBackend.expectGET(url)
.respond(200, response);
$http.get(url).success(successCallback);
expect(successCallback).not.toHaveBeenCalled();
$httpBackend.flush();
expect(successCallback.token).toBe(1);
}));
});
}
);
我如何继续 TypeError:' undefined'不是对象(评估' successCallback.token)作为参考,我的LoginFactory如下所示:
var LoginFactory = function ($q, $http) {
return {
getData: function (url) {
var deferred = $q.defer();
$http.get('http://local/'+url)
.then(function () {
deferred.resolve(true);
}, function () {
deferred.resolve(false);
});
return deferred.promise;
}
};
};
LoginFactory.$inject = ['$q', '$http'];
factories.factory('LoginFactory', LoginFactory);
return LoginFactory;
提前致谢!
答案 0 :(得分:0)
正如您已经提到的那样,100
是您的代码破解的重点,因为successCallback.token
会返回一个函数,但它不会对您jasmine.createSpy()
的{{1}}提供token
。 1}}。来自官方docs,
当没有窥探功能时,jasmine.createSpy可以创建一个“裸”间谍。 这个间谍扮演任何其他间谍 - 跟踪调用,参数等。 但它背后没有实施。间谍是JavaScript对象 并且可以这样使用。
因此,删除此行$httpBackend
将解决错误,但如果您确实要验证来自$ httpBackend的模拟响应,则需要在$ {http(或者)中的expect(successCallback.token).toBe(1);
回调中执行此操作承诺对象的success
方法如下
then
请注意,我在这里修改了您的代码以显示示例,理想情况下,您不必在测试用例中单独编写HTTP调用代码,调用实际函数进行HTTP调用并验证期望。
有关 $http.get(url).success(function(response){
expect(response.token).toBe(1);
});
的详细信息,请查看此link。