我如何单元测试休息角度服务和控制器?

时间:2015-11-18 11:28:34

标签: angularjs rest unit-testing restangular angular-mock

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,就像在真实控制器中进行测试一样。

老实说我是单位测试新人。

3 个答案:

答案 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)

我建议使用Selenium:

http://www.seleniumhq.org/

易于编写单元测试,可以使用jenkins构建自动化。