【问题标题】:An issue with testing $resource service by $httpBackend通过 $httpBackend 测试 $resource 服务的问题
【发布时间】:2014-10-17 12:51:04
【问题描述】:

我想我错过了什么。花了一些时间试图了解为什么我的测试不起作用。

代码。

angular.module('services')
    .factory('UserPreferencesService', ['$resource', function ($resource)
    {
        return $resource('/rest/user-preferences/:id', {},
        { getById: { method: "GET", params: { id:'@id'}} });

    }
]);

测试:

it('should get by Id', function() {
    //given
    var preferences = {language: "en"};

    httpBackend.whenGET('/rest/user-preferences/1').respond(preferences);

    //when
    service.getById( {id:1} ).$promise.then(function(result) {

        console.log("successssssssssssssssssssssssssssssssssssss");

     //then
     expect(result).toEqual(preferences);
    }, function() {
        console.log("something wrong");
    })
});

它永远不会触发:“successsssssssssssssssssssssssssssssssssss”。

我错过了什么?

【问题讨论】:

  • 请把你测试的所有代码贴出来,这样看上下文很难。

标签: angularjs rest testing jasmine httpbackend


【解决方案1】:

您的代码中有一些错误和其他一些内容缺失。

主要问题是您没有调用模拟来自服务器的响应的flush() 函数,因此从未解决$promise。另外,请记住,当 promise 得到解决时,您得到的响应是一个 promise,这意味着 this: expect(result).toEqual(preferences); 将不起作用,但 this: expect(result.lang).toEqual(preferences.lang); 会。

这里有一个固定版本的代码:

服务:

angular.module('services',['ngResource'])
    .factory('UserPreferencesService', ['$resource', function ($resource)
    {
      return $resource('/rest/user-preferences/:id', {},
        { getById: { method: "GET", params: { id:'@id'}} });
    }
]);

测试:

describe('My Suite', function () {
  var httpBackend, service; 
  beforeEach(module('services'));

  beforeEach(inject(function (_$httpBackend_, UserPreferencesService) {
      httpBackend = _$httpBackend_;
      service = UserPreferencesService;
  }));

  describe('My Test', function () {
      it('should get by Id', function() {
        var preferences = {language: "en"};
        var result = {};

        httpBackend.whenGET('/rest/user-preferences/1').respond(preferences);

        service.getById({id:1}).$promise.then(function(result_) {
          result = result_;
        });

        expect(result.language).not.toEqual(preferences.language);

        httpBackend.flush();

        expect(result.language).toEqual(preferences.language);
    });
  });
});

Working Example

【讨论】:

  • 是否有可能在最后一个期望(result.language)中的.flush()之后尚未处理结果...?但空的 {} 对象,因为尚未处理承诺。
  • @ses 在这种情况下不是,除非你做了这样的事情:service.getById({id:1}).$promise.then(function(result_) { $timeout(function(){result = result_;}); }); 示例:plnkr.co/edit/L4sVkGQMiRmxqP6lED8J?p=preview
【解决方案2】:

我想补充一点,我遇到了同样的问题,但是使用了回调,如下:

 httpBackend.whenGET('/rest/user-preferences/1').respond(function(method, url, data) {
                //do something with method, url, data...
                return 200;
            });

在我将 return 200 替换为 return [200] 之前,它从未受到攻击。显然它需要一个数组才能返回。

我觉得这个信息可以更明确in the documentation

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2011-02-04
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多