我很难理解如何解决测试控制器的单元问题,这会在初始化期间进行GET调用。
当测试执行POST请求的控制器方法时,由于初始GET调用,我在测试中遇到以下错误:
错误:意外请求:GET
控制器的主要部分如下所示:
.controller('someController', function($scope, $http, $log) {
$scope.posts = [];
$scope.content = '';
$scope.read = function() {
$http.get('/read.php')
.success(function(data) {
$scope.posts = data;
})
.error(function(data, status, headers, config) {
throw new Error('Something went wrong with reading data');
});
};
$scope.read();
$scope.write = function() {
$http({
method: 'POST',
url: '/write.php',
data: "content=" + $scope.content,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
.success(function(data) {
$scope.posts.push({ id : data.id, task : $scope.content })
})
.error(function(data, status, headers, config) {
throw new Error('Something went wrong with writing data');
});
};
});
正如您所看到的,我在定义后立即调用read()方法 - 以便在页面加载时从数据库中提取所有记录。
我已经尝试过.config()或其他服务了,但显然结果是一样的。
现在 - 我的测试如下:
describe('someController tests', function() {
var $scope,
$http,
$httpBackend,
$log;
beforeEach(function() {
module('myApp');
inject(function($rootScope, _$http_, _$httpBackend_, _$log_) {
$scope = $rootScope.$new();
$http = _$http_;
$httpBackend = _$httpBackend_;
$log = _$log_;
});
$httpBackend.expectGET("/mod/read.php").respond({});
});
it('should add new record', inject(function($controller) {
$controller('ToDoController', {
$scope : $scope,
$http : $http,
$log : $log
});
$scope.posts = [];
$scope.content = 'Some content';
$httpBackend
.whenPOST('/write.php')
.respond({ id : 1, content : $scope.content });
$scope.write();
$httpBackend.flush();
expect($scope.posts.length).toBe(1);
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
}));
});
现在 - 我对这段代码有几个问题。
在页面加载中调用控制器内的方法是一种好习惯吗?我知道如果我在文档中使用ng-init来调用它 - 这可以解决我所有的问题,但我只是不喜欢这种方法。
在我正在调用的测试的beforeEach()方法中:
$ httpBackend.expectGET( “/ MOD / read.php”)作出响应({});
反映初始化期间read()方法的调用,但是再次 - 我不确定这是正确的做法。我知道如果我删除它 - '应该添加新记录'测试将失败并出现上述错误。
我知道afterEach()应该放在it()块之外,但如果我这样做 - 它会导致同样的问题,但错误将适用于此描述块中的所有测试。把它放在it()块里面被认为是不好的做法/不正确吗?
如果在beforeEach()循环中已经触发了调用,我将如何执行read()测试?
最后 - 您的建议是改进/重写控制器和测试以确保其最佳效果?
我对TDD很陌生 - 所以我确信这只是我对这个主题的有限理解,但我会感激一些建设性的帮助。