【发布时间】:2013-07-23 10:39:38
【问题描述】:
经过大量阅读,从 AngularJS 控制器调用 Web 服务的推荐方法似乎是使用工厂并从中返回一个承诺。
这里我有一个调用示例 API 的简单工厂。
myApp.factory('MyFactory', ['$http',function($http) {
var people = {
requestPeople: function(x) {
var url = 'js/test.json';
return $http.get(url);
}
};
return people;
}]);
这就是我在控制器中的调用方式
myApp.controller('MyCtrl1', ['$scope', 'MyFactory', function ($scope, MyFactory) {
MyFactory.requestPeople(22).then(function(result) {
$scope.peopleList = result;
});
}]);
虽然它工作正常,但我希望能够模拟在调用 then 时传入的 result。这可能吗?
到目前为止,我的尝试没有产生任何结果。这是我的尝试:
//Fake service
var mockService = {
requestPeople: function () {
return {
then: function () {
return {"one":"three"};
}
}
}
};
//Some setup
beforeEach(module('myApp.controllers'));
var ctrl, scope;
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('MyCtrl1', { $scope: scope, MyFactory: mockService });
}));
//Test
it('Event Types Empty should default to false', inject(function () {
expect(scope.peopleList.one).toBe('three');
}));
我在 karma runner 中运行时遇到的错误是
TypeError: 'undefined' 不是一个对象(评估 'scope.peopleList.one')
如何让这个测试与我的模拟数据一起工作?
【问题讨论】:
-
我已经阅读过它,但我的控制器不需要 $http。你能详细说明你的意思吗?
标签: javascript unit-testing angularjs mocking jasmine