3

Angular$resourceを使用して行っている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');
  });
}));

この問題を解決するための提案やリンクは本当にありがたいです。どうもありがとう。

4

2 に答える 2

5

あなたはとても近くにいて、足りないのはへの呼び出しだけでした$httpBackend.flush();。動作テストは次のようになります。

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

プランカーでのライブテスト: http://plnkr.co/edit/Pp0LbLHs0Qxlgqkl948l?p = Preview

$httpBackendモックのドキュメントを確認することもできます。

于 2013-01-31T22:39:11.947 に答える
0

それ以降のバージョンのangularでは、1.2.0rc1を使用しています。これは、$ apply内で呼び出すか、スコープで$digestを呼び出す必要があります。次のような操作を行わない限り、リソース呼び出しは行われません。

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();
});
于 2013-10-01T15:41:27.583 に答える