angularjs - $httpBackend 测试 $resource 服务的问题

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

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

我错过了什么?

最佳答案

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

主要问题是您没有调用模拟服务器响应的 flush() 函数,因此 $promise 从未得到解决。另外,请记住,当 promise 得到解决时,您得到的响应就是一个 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

关于angularjs - $httpBackend 测试 $resource 服务的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26425429/

相关文章:

javascript - 将额外参数传递给 AngularJS 中的自定义排序函数

javascript - Angular 将输入值绑定(bind)到另一个变量

java - REST POST 不支持的媒体类型

python - Travis 作业报告成功,即使测试失败(使用 tox)

python - pypy 解释器无法识别 nosetests 而 pypy3 可以

javascript - Angular 新路由器从 URL 中删除/#

javascript - Angular 数据绑定(bind)未更新正确的模型范围

javascript - ajax GET 函数在被另一个函数调用时不返回成功值

rest - JWT 和一次性 token ?

Spring Security HttpSecurity 配置测试