Api呼叫的休息角度。
我的目标是通过调用Controller和Test来编写一个单元测试用例,所有的Scope都被分配了,代码块的REST API响应但不是MOCK RESPONSE。
休息角色服务: -
@Autowired
private BufferMetricReader metrics;
int count = metrics.findOne("my.metrics.key").getValue().intValue();
我将此服务作为依赖项注入控制器 控制器代码遵循: -
angular.module('movieApp')。controller('MoviesController',['$ scope','movieApiService', 函数($ scope,MovieService){
(function () {
angular.module('movieApp').service('movieApiService', callMoviesApi);
function callMoviesApi(Restangular) {
this.getMyMovie= function (Id) {
return Restangular.one('movies/' + movieId).get().then(function(result){
return result.plain();
});
};
this.getMoviesList = function () {
return Restangular.all('movies').getList().then(function(result){
return result.plain();
});
};
}
}());
我确实尝试为Above Controller编写单元测试不好:-(
测试代码遵循: -
$scope.movie = $stateParams.movieId;
MovieService.getMovieDetails($scope.movie).then(function (result) {
$scope.movieDetails = result;
$scope.movieId = result._id;
$scope.movieName = result.displayName;
});
}
]);
错误提升: -
'use strict';
(function() {
describe('MoviesController', function() {
//Initialize global variables
var scope,stateParams={},
MoviesController;
// Load the main application module
beforeEach(module('movieApp'));
beforeEach(inject(function($controller, $rootScope,$stateParams) {
scope = $rootScope.$new();
stateParams.movieId='Baahubali';
HomeController = $controller('MoviesController', {
$scope: scope,
$stateParams:stateParams
});
}));
it('Should call movieApi and Assign Scopes', function() {
var Api="http://testsite.com/moives/thor";
var myScope=$httpBackend.expectGET(Api).passthrough();
expect(scope.movie).toBeDefined();
console.log('****'+scope.movie.displayName);
});
});
})();
任何人都可以帮我写一个单元测试用例可以初始化控制器和Assing Scopes,就像在真实控制器中进行测试一样。
老实说我是单位测试新人。
答案 0 :(得分:1)
我建议Selenium with Cucumber让你以一种漂亮可读的格式测试场景
但是为了只测试一个REST api你需要一个javax.ws.rs.client.Client的实现,我使用org.glassfish.jersey.client.JerseyClient。
private final Client client = ClientBuilder.newClient();
e.g。
@When("^I want to retrieve all cells for the report with id \"([^\"]*)\".$")
public void accessCellReport(String id) {
response = client.target(URL).path(PathConstants.PATH_ID)
.resolveTemplate(PathConstants.PARAM_ID, reportId).request(MediaType.APPLICATION_JSON).get();
RestAssertions.assertResponseOk(response);
}
答案 1 :(得分:1)
首先,我会使用Restangulars一种方法,因为它应该被使用。 在此处阅读更多相关信息:https://github.com/mgonto/restangular#creating-main-restangular-object
Restangular.one('movies', movieId);
在我的服务测试中,我会做这样的事情来测试是否已经调用了正确的端点。
it('should call /movies/{movieId}', function() {
var spy = sinon.spy(Restangular, 'one');
var movieId = 1;
movieApiService.getMyMovie(movieId);
expect(spy).to.have.been.calledWith('movies', movieId);
});
然后我会在另一个控制器测试中制作一个sinon存根来模拟服务的响应。
it('should set my movies variabel after calling movie service', function() {
var mockResponse = [
{
id: 1,
title: 'Titanic'
},
{
id: 2,
title: 'American History X'
}
];
sinon.stub(movieApiService, 'getMyMovie')
.returns(
$q.when(
[
{
id: 1,
title: 'Titanic'
},
{
id: 2,
title: 'American History X'
}
]
);
);
expect($scope.movieList).to.equal(mockResponse);
});
另一个用于检查控制器捕获函数的测试被调用。
it('should call error handling if service rejects promise', function() {
sinon.stub(movieApiService, 'getMyMovie')
.returns(
$q.reject('an error occured when fetching movie');
);
});
答案 2 :(得分:0)