使用$ resource,$ httpbackend vs mocking对服务进行单元测试

时间:2015-07-27 15:12:36

标签: angularjs unit-testing angular-services

在使用$resource对服务进行单元测试时,最佳做法是什么 - 使用$httpBackend或模拟资源?

我有以下服务:

  angular.module('example')
    .factory('MyService', ['$resource',
      function($resource) {

       var service = $resource('/api/example/', {}, {
          create: {
            method: 'POST'
          }
        });

        var create = function(payload) {
          return service.create({}, payload).$promise;
        };

        return {
          create: create
        };
      }
    ]);

使用$ httpbackend

    describe('#create', function() {
      it('should send a post request to api/example', function() {
        $httpBackend.expectPOST('/api/example')
          .respond({
            name: 'Something'
          });

        MyService.create({ example: 'payload' }});

        $httpBackend.flush();

        expect(MyService.create).toEqual({example: 'payload'})
      });
    });

1 个答案:

答案 0 :(得分:2)

在测试服务时,请使用$httpBackend。它被设计为常规$http模块的替代品,因此您可以通过$resource保证您的服务通话,并且返回做正确的事情。

如果你要模仿$resource,那么你几乎不会行使代码路径。您还可以通过服务的实现来纠缠您的测试,这可能会从使用$resource直接转换为使用$http或第三个模块。您的测试并不关心如何进行HTTP调用,只是它是正确的调用并返回一些预期的数据。

当您测试系统的某些部分而不是服务时,请嘲笑。在这种情况下,您只需要MyService.create来返回特定对象,而您并不关心它是如何获得的。没有理由将非服务测试与服务需要进行的HTTP调用联系起来。