$ httpBackend测试$ resource服务的问题

时间:2014-10-17 12:51:04

标签: angularjs rest testing jasmine httpbackend

我想我想念一些东西。花了一些时间试图理解为什么我的测试不起作用。

代码。

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");
    })
});

它永远不会触发:" successssssssssssssssssssssssssssssssssssssssss"

我错过了什么?

2 个答案:

答案 0 :(得分:4)

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

主要问题是您没有调用模拟服务器响应的flush()函数,因此$promise从未解决过。另外,请记住,当承诺得到解决时,您获得的响应是​​承诺,这意味着:expect(result).toEqual(preferences);将无效,但是: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

答案 1 :(得分:0)

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

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

直到我将return 200替换为return [200]之后,它才被击中。显然,它需要一个数组才能返回。

我认为此信息可以更明确地显示here