下列测试通过:
admin.controller.js
angular
.module('mean-starter')
.controller('AdminController', AdminController);
function AdminController(User, Auth, $state) {
var vm = this;
User
.list()
.success(function(data) {
vm.users = data;
})
.error(function() {
console.log('Problem getting users.');
});
vm.delete = function(id) {
User
.delete(id)
.success(function(data) {
if (Auth.getCurrentUser()._id === id) Auth.logout(); // deleting yourself
else $state.reload();
})
.error(function() {
console.log('Problem deleting user.');
});
};
}admin.controller.spec.js
describe('AdminController', function() {
var AdminController, $httpBackend;
beforeEach(module('mean-starter'));
beforeEach(module('templates'));
beforeEach(inject(function($controller, $rootScope, _$httpBackend_) {
$httpBackend = _$httpBackend_;
AdminController = $controller('AdminController');
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('gets users', function() {
$httpBackend
.expectGET('/users')
.respond('foo');
$httpBackend.flush();
});
});我可没指望会这样。以下是我所预期的情况:
beforeEach中实例化。User.list()被运行。$http尚未被$httpBackend覆盖,因此请求通常会发出。$httpBackend.expectGET('/users').respond('foo')期望GET /users。然后说,“如果我收到这个请求,我会用'foo‘来回复。”$httpBackend.flush()说:“为$httpBackend收到的任何请求发送定义的响应。”.expectGET失败是因为它没有接收到它的请求(请求发生在期望之前)。.flush()抛出一个错误,因为没有什么需要刷新的。我没有得到我所期望的结果,所以我上面的逻辑一定是错的--这是什么?
发布于 2015-08-10 15:52:38
$http尚未被$httpBackend覆盖,因此请求通常会发出。
这不是一个正确的假设。$httpBackend在单元测试中自动使用(它是用于单元测试的ng模拟模块的一部分)。因此,无论您在单元测试代码中是否使用$httpBackend,它都在那里,它正在处理代码生成的所有$http请求。
想想看,如果它没有这样做,您的单元测试可能会发出真正的请求。
编辑
对于这种情况,控制器在实例化后立即发出HTTP请求,我喜欢在您实例化控制器之前将$httpBackend.expectGET()调用放在beforeEach块中。
我还会在flush()块中使用beforeEach后端。我认为,这清楚地表明,这些请求发生在控制器启动时。这意味着我不需要在每个单元测试中都有这样的期望。
https://stackoverflow.com/questions/31923569
复制相似问题