【问题标题】:Testing backend API via $http in AngularJS/karma/jasmine tests?在 AngularJS/karma/jasmine 测试中通过 $http 测试后端 API?
【发布时间】:2014-01-10 16:59:13
【问题描述】:

如何使用 AngularJS/karma/jasmine 测试来测试我的 API 后端?

我试图创建最小的测试用例来显示我的错误:

echo_server.py

from bottle import response, route, run

@route('/echo/<echo>')
def echo_echo(echo):
    response.headers['Access-Control-Allow-Origin'] = '*'
    return {'echo': echo}    # Served as JSON

if __name__ == '__main__':
    run()

test/unit/apiSpec.js

// Should this be in `test/e2e/apiSpec.js`?
describe('echo', function () {
    var scope, http;

    beforeEach(inject(function ($rootScope, $http) {
        $http.defaults.useXDomain = true;    // CORS
        scope = $rootScope.$new();
        http = $http;
    }));


    it("should echo from server", function () {
        scope.$apply(function () {
            var ret;
            http.get("http://localhost:8080/echo/foo")
                .success(function (data, status, headers, config) {
                             ret = data;
                         })
                .error(function (data, status, headers, config) {
                           ret = data;
                       });
            console.log('ret = ' + ret);
            expect(ret.echo).toBe("foo");
        });
    });
});

karma start configs/karma.conf.js 的输出

INFO [karma]: Karma v0.10.8 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.2 (Linux)]: Connected on socket m7imfgmhXdOY9JVKJh8r
LOG: 'ret = undefined'
PhantomJS 1.9.2 (Linux) echo should echo from server FAILED
    Error: Unexpected request: GET http://localhost:8080/echo/foo
    No more request expected
        at $httpBackend (~Projects/~karma-tests/test/lib/angular/angular-mocks.js:1178)
    ...

【问题讨论】:

  • 为什么要使用 angularJS 和 karma 来测试后端。 AngularJS 和 Karma 都是关于前端的。您不需要浏览器来向服务器发送 HTTP 请求。而 angular-mocks 正是用来模拟一个后端,所以你不能用它来测试你的真实后端。
  • 将我所有的测试放在一个地方的好处是,当它们通过时;我可以部署到登台。即:在所有开发过程中保持测试服务器运行。
  • 我为后端编写了用 Java 编写的单元测试和集成测试,使用 Karma 编写的 JavaScript 单元测试和使用角度量角器的 JavaScript 编写的 e2e 测试,我可以构建和测试所有内容(使用 gradle)用一个命令。我的 CI 服务器在每次推送时也会这样做。为正确的工作使用正确的工具不应阻止 uoi 运行所有测试,并且只有在所有测试通过时才进行部署。
  • 当然,但如果我只做通用 RESTful 测试,JavaScript 应该没问题...
  • 我并不是说不要使用 JavaScript。业力和角度模拟虽然不合适。我很确定 NodeJS 生态系统中存在一些东西来测试 RESTful 后端,但我不太了解它,无法提出建议。

标签: angularjs jasmine karma-runner httpbackend angularjs-http


【解决方案1】:

上述测试堆栈不适用于这种方式。由于 $httpMockBackend 已装饰在原始 $httpBackend 之上,因此该请求永远不会被分派。

要允许请求通过,您要么需要排除 angular-mocks.js,要么指定一些 url 应该像这样通过:

angular.module('yourModule').run(function ($httpBackend) {
    $httpBackend.whenGET(/.*/).passThrough();
}

阅读$httpMockBackend here 的文档

另外,您的测试是同步的,而服务器响应是异步的,所以它不会按预期工作。

【讨论】:

  • 但是$httpBackend.whenGET(/.*/) 没有.passThrough() 方法?!
  • $httpBackend 可以通过ngMockngMockE2E 使用..但它的行为不同。 ngMockE2E 有 .passThrough() 。你可以看看differences
猜你喜欢
  • 2013-05-15
  • 2014-12-07
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多