我正在尝试为我已创建的Angular功能编写测试。但是我在进入工作流程时遇到了一些麻烦。
用户可以单击元素(div),然后Angular将一些数据保存到我的数据库中,
控制器看起来像这样,
$scope.addMovie = function() {
movieAdd.add()
.then(function(response){
$scope.movieListID = response;
createMovie.create({
title: $scope.movieListID.original_title,
release_date: $scope.movieListID.release_date,
image: $scope.movieListID.poster_path,
movie_id: $scope.movieListID.id
}).then(init);
})
}
服务看起来像这样,
function httpPromise (url) {
var deferred = $q.defer();
$http({
method:'JSONP',
url: url
})
.success(function(data){
deferred.resolve(data);
})
.error(function(){
deferred.reject();
});
return deferred.promise;
}
service.add = function(searchquery){
var movieID = $(event.currentTarget).parent().find('.movieID').text();
return httpPromise(
baseUrl + movieID + '?api_key=a8f7039633f2065942cd8a28d7cadad4&query=' + '&append_to_response=releases&callback=JSON_CALLBACK'
)
}
这个想法是当用户点击带有文字的链接时#34;添加电影" $scope.addMovie
函数触发。此函数调用add
服务中的movieAdd
函数。
movieAdd服务添加功能从URL(通过将电影的ID插入URL中创建)创建JSONP数据请求。完成后,movieAdd.add
函数将数据存储在movieListID
范围内,然后创建一个电影。
所以我理解它是如何工作的,但是我可以/应该为它们编写测试的一些因素是什么?
答案 0 :(得分:1)
您有以下案例需要测试 -
我建议的第一件事是将'movieID'作为参数传递,而不是从DOM中找到它。让“控制者”这样做。
这是对最后成功案例的测试 - >
it('should successfully add a movie and create it on success', function() {
var movie = {
'original_title': 'Mask of Zorro',
'release_date': '1/1/2001',
'image': '/some/image/path',
'movie_id': 'some_id'
};
var addMovieDeferred = q.defer(), addMoviePromise = addMovieDeferred.promise,
createMovieDeferred = q.defer(), createMoviePromise = createMovieDeferred.promise;
spyOn(movieAdd, 'add').and.returnValue(addMovieDeferred);
spyOn(createMovie, 'create').and.returnValue(createMoviePromise);
$scope.addMovie();
addMovieDeferred.resolve(movie);
scope.$apply();
expect(movieAdd.add).toHaveBeenCalled();
createMovieDeferred.resolve();
scope.$apply();
expect(createMovie.create).toHaveBeenCalledWith(jasmine.objectContaining({
title: 'Mask of Zorro',
release_date: '1/1/2001',
image: '/some/image/path',
movie_id: 'some_id'
});
});
您可以通过执行'deferred.reject'来执行'错误'案例。
根据最终调用的'init'函数,你可以在方法调用或范围值上断言。
对于'$ http'部分,您可以编写一个单独的'$ httpBackend'测试,该测试将主要根据输入'movieID'参数对URL上的格式设置断言。
希望这有帮助。