如何在Jasmin中使用rest调用来测试AngularJS服务

时间:2016-06-14 13:23:52

标签: javascript angularjs rest mocking jasmine

嘿,我是AngularJS测试的新手,我想弄明白,

  1. 我应该如何测试负责我的休息电话的AngularJS服务。

  2. 如何在我想测试的其他控制器中调用此服务。

  3. 我需要测试使用rest请求的datafactory服务 需要测试的代码是这样的:

    select 100.0 * count(b.memberID) / count(a.memberID)
    from tableA a
    left join tableB b on a.memberID = b.memberID and a.entryDate BETWEEN '20160501' AND '20160515'
    
    var app = angular.module("app",[]);
    
    app.controller("mainCTRL", ["$scope","dataFactory",function($scope,dataFactory){
      $scope.title = "Hello World";
      dataFactory.getEntries("fakeSuffix");
      
      }]);
    
    app.factory('dataFactory', ['$http', '$window', '$log', function ($http, $window, $log) {
                var urlBase = $window.location.origin + '/api',
                    dataFactory = {};
                /**
                * get all Entries.
                **/
                dataFactory.getEntries = function (suffix) {
                    $log.debug("************ Get All Entries ************");
                    $log.debug("url:", urlBase + suffix);
                    return $http.get(urlBase + suffix, { headers: { cache: false } });
                };
    
                /**
                * get single Entry.
                **/
                dataFactory.getEntry = function (id) {
                    $log.debug("************ Get Single Entry ************");
                    return $http.get(urlBase + '/' + id);
                };
    
                /**
                * insert Entry
                **/
                dataFactory.postEntry = function (method, entry) {
                    var url = urlBase + '/' + method;
                    return $http.post(url, entry);
    
                };
    
                /**
                * update Entry
                **/
                dataFactory.updateEntry = function (entry) {
                    $log.debug("************ Update Single Entry ************");
                    return $http.put(urlBase + '/' + entry.id, entry);
                };
    
                /**
                * delete Entry
                **/
                dataFactory.deleteEntry = function (id) {
                    $log.debug("************ Delete Single Entry ************");
                    return $http.delete(urlBase + '/' + id);
                };
    
                return dataFactory;
            }]);

3 个答案:

答案 0 :(得分:1)

试一试,回答这个问题Injecting a mock into an AngularJS service

  module(function($provide) {
      $provide.value('$http', {
          get: function(url, options) {
              // your get implementation
          },
          post: function(url, data) {
              // your post implementation
          },
          'delete': function(url) {
              // your delete implementation
          },
          put: function(url, data) {
              // your put implementation
          }
      });
  });

答案 1 :(得分:1)

据我所知,要测试服务,请创建类似于控制器的Jasmine测试用例,不要使用控制器初始化。

要根据服务响应测试控制器,请为相应的服务创建spyOn并模拟服务响应。

答案 2 :(得分:1)

Q.1 - 我应该如何测试一个负责我的休息电话的AngularJS服务。
Ans。 - 我已经写了一个您的某项服务的测试用例'方法如下。您可以为其他方法编写类似的测试用例。

Q.2 - 如何在我想测试的其他控制器中调用此服务。
Ans。 - 在下面的代码中,当你正在为您的服务编写测试用例,该测试用例依赖于$http的{​​{1}},getpostput方法,I'在测试用例中注入了delete并在$httpBackend块中模拟了所有这些方法。同样,当您为控制器编写依赖于此服务的测试用例时,您将不得不使用类似的方法。只需在服务器的测试用例中注入服务,然后模拟从控制器调用的所有服务方法。

beforeEach

希望这有帮助。