Как я могу использовать Unit Test Rest Angular Service и Controller?

Rest-angular для вызова API.

Моя цель - написать пример модульного теста, вызвав контроллер и протестировать всю область действия, блоки кода с ответом REST API, но не ОТВЕТОМ MOCK.

Отдых Angular Service :-

(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();
            });
        };
    }

}());

Где я внедряю эту службу в контроллер как зависимость Следует код контроллера: -

angular.module('movieApp').controller('MoviesController', ['$scope','movieApiService', function ($scope, MovieService) {

    $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);

            });
        });
    })();

Ошибка возникает: –

Error: Unexpected request: GET http://testsite.com/movies/undefined
        Expected GET http://testsite.com/movies/undefined? 
            at $httpBackend (C:/wrokingdir2015/public/lib/angular-mocks/angular-mocks.js:1245)
            at sendReq (C:/wrokingdir2015/public/lib/angular-mocks/public/lib/angular/angular.js:9695)

Может ли кто-нибудь помочь мне написать модульный тестовый пример, который может инициализировать контроллер и области действия, как в реальном контроллере для тестирования.

Честно говоря, я новичок в модульном тестировании.


person Prasad    schedule 18.11.2015    source источник


Ответы (3)


Я предлагаю Selenium with Cucumber, чтобы тестировать сценарии в красивом и читаемом формате

но для тестирования только API REST вам просто нужна реализация 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);
    }
person aurelius    schedule 18.11.2015
comment
Эй, Аврелий, снова ты :-) Конечно, я имел в виду это, например, транспортир, селен и т. Д. Спасибо - person Prasad; 18.11.2015
comment
хорошо, надеюсь, что я полезен :) - person aurelius; 18.11.2015
comment
другое дело, для тестирования rest api вам даже не нужен селен, достаточно трикотажного клиента, как вы можете видеть в моем опубликованном примере - person aurelius; 18.11.2015

Прежде всего, я бы использовал один из методов 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);

});

И еще один тест для проверки того, что вызывается функция catch контроллера.

it('should call error handling if service rejects promise', function() {
        sinon.stub(movieApiService, 'getMyMovie')
             .returns(
                 $q.reject('an error occured when fetching movie'); 
             );
});
person chaaya    schedule 08.02.2016

Я предлагаю использовать Selenium:

http://www.seleniumhq.org/.

Легко писать модульные тесты и можно автоматизировать с помощью сборки jenkins.

person Ágoston Székely    schedule 18.11.2015