Тестирование внутреннего API через $http в тестах AngularJS/karma/jasmine?

Как протестировать серверную часть API с помощью тестов AngularJS/karma/jasmine?

Я попытался создать наименьший тестовый пример, показывающий мою ошибку:

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()

тест/блок/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)
    ...

person A T    schedule 22.12.2013    source источник
comment
Зачем вам использовать angularJS и karma для тестирования бэкенда. AngularJS и Karma — все о внешнем интерфейсе. Вам не нужен браузер для отправки HTTP-запроса на сервер. И angular-mocks используется именно для имитации бэкенда, поэтому вы не можете использовать его для проверки вашего реального бэкенда.   -  person JB Nizet    schedule 22.12.2013
comment
Преимущество размещения всех моих тестов в одном месте заключается в том, что когда они проходят; Я могу развернуть на стадии. То есть: поддерживать работу тестового сервера на протяжении всей разработки.   -  person A T    schedule 22.12.2013
comment
У меня есть модульные тесты и интеграционные тесты, написанные на Java для моего бэкэнда, модульные тесты, написанные на JavaScript с Karma, и тесты e2e, написанные на JavaScript с угловым транспортиром для углового внешнего интерфейса, и я могу собрать и протестировать все (используя gradle) с помощью одной команды . Мой CI-сервер также делает это при каждом нажатии. Использование правильного инструмента для правильной работы не должно мешать uoi запускать все тесты и развертывать их только в том случае, если все тесты пройдены.   -  person JB Nizet    schedule 22.12.2013
comment
Конечно, но если я делаю только общее тестирование RESTful, JavaScript должен быть в порядке...   -  person A T    schedule 22.12.2013
comment
Я не говорю не использовать JavaScript. Карма и угловые насмешки не подходят. Я почти уверен, что в экосистеме NodeJS существует что-то для тестирования бэкэнда RESTful, но я недостаточно хорошо его знаю, чтобы что-то предложить.   -  person JB Nizet    schedule 22.12.2013
comment
О, ладно, только что сделал быстрый поиск в Google и нашел frisbyjs.com.   -  person A T    schedule 22.12.2013


Ответы (1)


Упомянутый стек тестирования не предназначен для такого использования. Запрос никогда не отправляется из-за того, что $httpMockBackend был оформлен поверх исходного $httpBackend.

Чтобы разрешить прохождение запросов, вам нужно либо исключить angular-mocks.js, либо указать, что некоторые URL-адреса должны проходить следующим образом:

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

Прочтите документацию для $httpMockBackend здесь

Кроме того, ваш тест является синхронным, а ответ сервера асинхронным, поэтому он не будет работать должным образом.

person Kenneth Lynne    schedule 22.12.2013
comment
Но у $httpBackend.whenGET(/.*/) нет метода .passThrough()?! - person victorwoo; 15.05.2015
comment
$httpBackend можно использовать через ngMock или ngMockE2E .. но он ведет себя по-разному. ngMockE2E имеет .passThrough() . Вы можете ознакомиться с различиями. - person Markus; 14.10.2015