0

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

编码。

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

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

我错过了什么?

4

2 回答 2

4

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

主要问题是您没有调用flush()模拟服务器响应的函数,因此$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);
    });
  });
});

工作示例

于 2014-10-17T14:06:09.840 回答
0

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

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

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

我觉得可以在文档中更明确地说明此信息。

于 2018-06-28T09:11:40.257 回答