构建Angular特征的测试

时间:2015-12-01 16:31:43

标签: angularjs tdd

我正在尝试为我已创建的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范围内,然后创建一个电影。

所以我理解它是如何工作的,但是我可以/应该为它们编写测试的一些因素是什么?

1 个答案:

答案 0 :(得分:1)

您有以下案例需要测试 -

  1. 添加电影失败
  2. 添加电影成功和创建电影失败
  3. 添加电影成功和创建电影成功
  4. 我建议的第一件事是将'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上的格式设置断言。

    希望这有帮助。