Модульный тест Breezejs с jasmine karma angular

Я создаю приложение на основе Breeze и Angular.

Они довольно хорошо работают вместе, но модульный тест представляет собой проблему.

Это довольно ванильный тест, но Бриз продолжает входить в середину:

describe('myController', function () {

    beforeEach(inject(function ($injector) {
        module('app');
        $httpBackend = $injector.get('$httpBackend');
        authRequestHandler = $httpBackend.whenGET().respond(200, 
            {"someStrings": ["foo", "bar"]})

        //more uninteresting code...

        createController = function () {
            return $controller('myController', { '$scope': $rootScope });
        };
    }));

    it('should fetch authentication token', function () {
        $httpBackend.expectGET('/auth.py');
        var controller = createController();
        $httpBackend.flush();
    });

Проблема в том, что Breeze продолжает инициализироваться. При выполнении я получаю следующее сообщение:

Error: cannot execute _executeQueryCore until metadataStore is populated.

//or,with different get: ... $httpBackend.when('GET', '/auth.py') 
//                                 .respond({ userId: 'userX' });

Error: Unexpected request: GET breeze/Breeze/Metadata No more request expected

Как мне предотвратить, имитировать или заглушить Breeze, чтобы он не мешал моим тестам... Например, эти тесты нацелены на аутентификацию, а не на данные.


person Miguel Delgado    schedule 13.09.2014    source источник


Ответы (1)


Breeze не «влезает в середину» сам по себе. Бриз не стал бы вмешиваться в ваш $http вызов авторизации. Я съем свою шляпу, если ты покажешь мне, что это так. Вы не показали, что это делает здесь.

Но вы подняли очень интересный вопрос о дизайне начальной загрузки приложения и последствиях этого дизайна для тестирования.

Очевидно, что либо метод запуска вашего модуля app, либо логика создания вашего контроллера выполняет запрос Breeze (возможно, они оба). Я делаю вывод из двух фактов:

  1. Исключение исходит от executeQueryCore, которое происходит только при явном выполнении запроса Breeze.

  2. Вы не касаетесь контроллера в своем тесте, ни в beforeEach, ни в it, что означает, что эти вызовы (и ваш вызов авторизации тоже) выполняются какой-то логикой автоматического запуска, которая выполняется до вашей спецификации it.

В своем тесте вы потрудились имитировать вызов аутентификации (который где-то находится в вашей логике запуска), но не вызовы Breeze.

Я не знаю, что вы на самом деле хотите проверить. Зачем вам проверять, что контроллер извлекает токен аутентификации? Это действительно забота диспетчера?

Возможно, вы представляете этот тест просто для того, чтобы проиллюстрировать проблемы, возникающие при тестировании контроллера без участия реального сервера?

Позвольте мне сделать шаг назад и сделать более важное и более общее замечание. Мы должны опасаться логики автоматического запуска, скрывается ли она в модуле приложения start или в конструкторе контроллера. Будьте осторожны, в частности, с логикой запуска, которая включает вызовы на сервер.

Я обычно отключаю автоматическую логику запуска в большинстве своих тестов. Я часто заменяю тестовые двойники проблемными зависимыми службами во время настройки моего тестового модуля... перед вызовом функции inject ngMock. Я уверен, что обратный вызов метода app.start использует ТОЛЬКО зависимые службы, которые легко подделать.

Если вы хотите продвигаться вперед, используя фактические зависимости, имитируя ответы HTTP с помощью $httpBackend, тогда вам придется подготовить $httpBackend для каждого запроса, который он получает из кода запуска... включая запросы, которые ВЫ делаете с Breeze.

В заключение я повторю, что Breeze делает только то, что вы ему говорите. Он совершенно не знает о ваших прямых $http вызовах.

person Ward    schedule 15.09.2014