以正确的方式测试角度资源

时间:2014-06-18 14:37:41

标签: angularjs jasmine

我的资源看起来像这样。

return $resource(baseURL + 'user',{},{         
     isPermitted: {method: 'POST', isArray:false, params: { regID: @regID} },
     doesExist:   {method: 'GET',  url: baseURL + 'user/doesExist' }
});

我已经为此编写了Jasmine测试。 我想要了解的是

  1. 这是布局测试的正确方法(或者我应该使用像sinon这样的东西)

  2. 这些是唯一需要在资源上执行的测试(或者我应该编写更多测试。请指出需要测试的其他方面)

  3. 测试:

    describe('UserCheck',function(){
    
      var $httpBackend, mockUserCheckResource;
      var webServiceBaseURL = 'server.comp.com';
    
      beforeEach(module('demo'));
    
        beforeEach(function(){
        angular.mock.inject(function($injector){
          $httpBackend = $injector.get('$httpBackend');
          mockUserCheckResource = $injector.get('UserCheck');
        });
      });
    
      afterEach(function(){
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
      });
    
      describe('isPermitted',function(){
    
        var  aObj = {regID:'xxx'};
    
        it('should issue a POST request to /user',function(){
          var result;
          $httpBackend.expectPOST(webServiceBaseURL + 'user',{regID:'xxx'}).respond(201);
    
          result = mockUserCheckResource.isPermitted(aObj);
          $httpBackend.flush();
          expect(result.regID).toBeDefined('xxx');      
        });
    
      });
    
    
      describe('doesExist',function(){
    
        it('should issue a GET request to /user/doesExist',function(){
          var result = {};
    
          $httpBackend.expectGET(webServiceBaseURL + 'user/doesExist?userID=123').respond({"isPresent":1});
    
          result = mockUserCheckResource.doesExist({userID:'123'});
          $httpBackend.flush();
          expect(result.isPresent).toBe(1);
        });
    
      });
    
    );
    

1 个答案:

答案 0 :(得分:0)

这里有两件事:您可以测试$resource是否正确映射了给HTTP调用的任何指令,这是毫无意义的,您还可以测试您的应用程序是否有一个名为UserCheck的服务它将两个方法(isPermitteddoesExist)映射到正确的HTTP调用。这些是不同的。对于后者 - 这肯定是有意义的 - 你的测试是好的(并且提供了很好的覆盖你的代码在输入(方法调用,HTTP请求)方面所做的事情,而不是它如何做。

不过,你可以简化一下,让你的测试更清晰:

describe('UserCheck',function(){

  var $httpBackend = undefined;
  var UserCheck = undefined;

  beforeEach(module('demo'));

  beforeEach(inject(function(_$httpBackend_, _UserCheck_) {
    $httpBackend = _$httpBackend;
    UserCheck = _UserCheck_;
  }));

  afterEach(function(){
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
  });

  describe('isPermitted',function(){
    it('should issue a POST request to /user',function(){
      $httpBackend.expectPOST('server.comp.com/user').respond(200);

      UserCheck.isPermitted({});
      $httpBackend.flush();
    });
  });


  describe('doesExist',function(){
    it('should issue a GET request to /user/doesExist',function(){
      $httpBackend.expectGET('server.comp.com/user/doesExist?userID=123').respond(200);

      UserCheck.doesExist({userID:'123'});
      $httpBackend.flush();
    });
  });
});

提示:

  • 在您的代码和测试中为您的服务命名相同
  • 除非您想测试服务/控制器如何处理它们,否则不要指定$ httpBackend返回的值
  • 始终在$ httpBackend的期望中使用纯文本网址:它允许快速映射方法和网址,还允许在整个测试中进行搜索(例如'此类网址或网址获取的位置叫?')
  • 没有全局状态,即使在测试中(注入的依赖项除外)。如果你的测试变得越来越大,重构和处理几个不同的用例会很痛苦,这基本上就是单元测试文件的目的。