经过大量阅读后,看来从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;
});
}]);
虽然效果很好,但我希望能够模拟在调用result
时传递的then
。这可能吗?
到目前为止,我的尝试没有产生任何效果。这是我的尝试:
//Fake service
var mockService = {
requestPeople: function () {
return {
then: functhtml" target="_blank">ion () {
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');
}));
我在业力赛跑者中运行此错误是
TypeError:“未定义”不是对象(评估“ scope.peopleList.one”)
如何使此测试与模拟数据一起使用?
我不认为$ httpBackend是您追求的目标,您希望在不依赖$ http的情况下模拟整个工厂吗?
看一下$
q
,特别是Testing标头下的代码示例。您的问题可以通过以下代码解决:
'use strict';
describe('mocking the factory response', function () {
beforeEach(module('myApp.controllers'));
var scope, fakeFactory, controller, q, deferred;
//Prepare the fake factory
beforeEach(function () {
fakeFactory = {
requestPeople: function () {
deferred = q.defer();
// Place the fake return object here
deferred.resolve({ "one": "three" });
return deferred.promise;
}
};
spyOn(fakeFactory, 'requestPeople').andCallThrough();
});
//Inject fake factory into controller
beforeEach(inject(function ($rootScope, $controller, $q) {
scope = $rootScope.$new();
q = $q;
controller = $controller('MyCtrl1', { $scope: scope, MyFactory: fakeFactory });
}));
it('The peopleList object is not defined yet', function () {
// Before $apply is called the promise hasn't resolved
expect(scope.peopleList).not.toBeDefined();
});
it('Applying the scope causes it to be defined', function () {
// This propagates the changes to the models
// This happens itself when you're on a web page, but not in a unit test framework
scope.$apply();
expect(scope.peopleList).toBeDefined();
});
it('Ensure that the method was invoked', function () {
scope.$apply();
expect(fakeFactory.requestPeople).toHaveBeenCalled();
});
it('Check the value returned', function () {
scope.$apply();
expect(scope.peopleList).toBe({ "one": "three" });
});
});
我已经围绕$ apply的功能添加了一些测试,直到我开始玩这个游戏时我才知道!
高格
问题内容: 我有一个ParseService,我想对其进行模拟以测试使用它的所有控制器,我一直在阅读有关茉莉花间谍的信息,但对我来说仍然不清楚。谁能给我一个关于如何模拟定制服务并在Controller测试中使用它的示例吗? 现在,我有一个使用服务插入书的控制器: 服务是这样的: 到目前为止,我的测试如下所示: 现在测试失败: 我做错了什么? 问题答案: 我做错的是没有在beforeEach中将模拟
问题内容: 我正在尝试测试AngularJS服务,但似乎不起作用。 谁能解释为什么响应为空? 问题答案: 试试这个: 请求返回的响应对象在属性(docs)中具有响应数据。
本文向大家介绍AngularJS 单元测试控制器,包括了AngularJS 单元测试控制器的使用技巧和注意事项,需要的朋友参考一下 示例 控制器代码: 考试: 跑!
问题内容: 我已经看过一些教程和基本示例,但是我很难为控制器编写单元测试。我已经看到了一些代码片段,它们实例化了控制器并让angular注入了对象,该对象又被用来为控制器创建一个新对象。但是我不知道为什么吗? 未定义 : 我最终使用了变量,而不是变量,但是在我的第一个测试中,我不知道如何在控制器中对 功能变量 进行单元测试: 控制器: 单元测试损坏: 这就是我得到的 TypeError:对象#没有
问题内容: 我有以下情况: controller.js controllerSpec.js 错误: 我也尝试过类似的方法,但没有成功: 我该如何解决?有什么建议? 问题答案: 有两种方法(或肯定有更多方法)。 想象一下这种服务(无论它是工厂都没关系): 使用此控制器: 一种方法是使用要使用的方法创建对象并对其进行监视: 然后,将其作为dep传递给控制器。无需注入服务。那可行。 另一种方法是模拟
本节介绍与AngularJS Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 AngularJS Mock Test I 问题1 - 关于AngularJS,以下哪项是正确的? A - AngularJS是一个构建大规模和高性能Web应用程序的框架,同时使它们易于维护。 B -