测试与外部服务角$资源(Testing Angular $resource with externa

2019-07-19 02:14发布

我努力让自己在REST请求我采用了棱角分明$资源做一些基本的测试。 该服务代码工作得很好。

'use strict';

angular.module('lelylan.services', ['ngResource']).
  factory('Device', ['Settings', '$resource', '$http', function(Settings, $resource, $http) {

    var token = 'df39d56eaa83cf94ef546cebdfb31241327e62f8712ddc4fad0297e8de746f62';
    $http.defaults.headers.common["Authorization"] = 'Bearer ' + token;

    var resource = $resource(
      'http://localhost:port/devices/:id',
      { port: ':3001', id: '@id' },
      { update: { method: 'PUT' } }
    );

    return resource;
  }]);

我使用的是指令内的设备资源和它的作品。 问题出来时,我开始做对服务的一些测试。 下面是一个简单的测试,我使用$ httpBackend嘲笑HTTP请求和我做的嘲笑URL的请求。

不幸的是不返回任何东西,虽然请求。 我相信这一点,因为如果到另一个URL的请求时,测试套件会自动引发错误。 我已经花了很多时间,但没有解决方案。 这里的测试代码。

'use strict';

var $httpBackend;

describe('Services', function() {

  beforeEach(module('lelylan'));

  beforeEach(inject(function($injector) {
    var uri = 'http://localhost:3001/devices/50c61ff1d033a9b610000001';
    var device = { name: 'Light', updated_at: '2012-12-20T18:40:19Z' };
    $httpBackend = $injector.get('$httpBackend');
    $httpBackend.whenGET(uri).respond(device)
  }));

  describe('Device#get', function() {
    it('returns a JSON', inject(function(Device) {
      device = Device.get({ id: '50c61ff1d033a9b610000001' });
      expect(device.name).toEqual('Light');
    }));
  });
});

由于设备不加载这是错误。

Expected undefined to equal 'Light'.
Error: Expected undefined to equal 'Light'.

我试着也用以下解决方案,但它并没有进入函数来检查期望。

it('returns a JSON', inject(function(Device) {
  device = Device.get({ id: '50c61ff1d033a9b610000001' }, function() {
    expect(device.name).toEqual('Light');
  });
}));

任何建议或链接来解决这个问题真的赞赏。 非常感谢。

Answer 1:

你是非常接近的,唯一缺少的是对的调用$httpBackend.flush(); 。 工作测试看起来如下:

it('returns a JSON', inject(function(Device) {
  var device = Device.get({ id: '50c61ff1d033a9b610000001' });
  $httpBackend.flush();
  expect(device.name).toEqual('Light');
}));

在plunker现场测试: http://plnkr.co/edit/Pp0LbLHs0Qxlgqkl948l?p=preview

您可能还需要检查为$ httpBackend模拟文档 。



Answer 2:

在角更高版本中,我使用的是1.2.0rc1你还需要内的$调用该应用或调用$消化上一个范围。 资源调用不言,除非你做这样的事情:

var o, back, scope;

beforeEach(inject(function( $httpBackend, TestAPI,$rootScope) {
    o = TestAPI;
    back = $httpBackend;
    scope = $rootScope.$new();

}));

it('should call the test api service', function() {
    back.whenGET('/api/test').respond({});
    back.expectGET('/api/test');
    scope.$apply( o.test());
    back.flush();
});


文章来源: Testing Angular $resource with external service