【问题标题】:Jasmine testing AngularJS $httpJasmine 测试 AngularJS $http
【发布时间】:2013-05-29 19:34:33
【问题描述】:

我正在尝试使用 Jasmine 异步测试来测试包装在 AngularJS 服务中的 REST API。我知道,我应该并且现在在服务器上的 API 上运行测试,并使用模拟 $httpBackend 来测试服务,但我仍然想知道如何在需要的地方进行异步测试。

我遇到的问题是我的延迟(由 $http 返回)似乎永远无法解决。跳过服务并尝试简单地使用 $http 有同样的问题。我在这里做错了什么:

describe('Jasmine + Angular + $http', function() {

    var injector; 

    beforeEach(function() {
        injector = angular.injector(['ng']);
    });

    it('can be tested', function() {

        injector.invoke(function($http) {

            var complete = false;

            runs(function() {
                $http.get('...').then(function(res) {
                    complete = true;
                });
            });

            waitsFor(function() {
                return complete;
            }, 'query to complete', 5000);

            runs(function() {
                expect(complete).toEqual(true);
            });

        });

    });

});

(我正在使用 grunt-contrib-jasmine 运行测试)

【问题讨论】:

  • 我想知道您的注射器的全局设置是否不起作用。你能试着把它移到一个 beforeEach 块中,这样你就有var injector 然后beforeEach(function(injector = angular.injector(['ng']));
  • 我已将构建注入器的代码更新为 beforeEach。注射器似乎在工作。我得到一个具有 get 函数的 $http 对象。问题似乎是它返回的 deferred 永远不会得到解决。
  • 如果我包含 jQuery 并将 $http 更改为 $(使用 jQuery 的 ajax 方法),一切正常。当以这种方式注入时,它似乎与 Angular 的延迟对象处理有关。
  • 在上述情况下,$http 是否为空?
  • 这对你来说怎么样?您是否检查过这是否是 CORS 问题?

标签: testing angularjs jasmine


【解决方案1】:

除非您调用 $httpBackend.flush(),否则 HTTP 请求不会触发。

更多信息可以在这里找到:http://docs.angularjs.org/api/ngMock.$httpBackend

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2014-01-10
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多