Подтвердить что ты не робот

Издевательствование и обрезка с помощью транспортира

Я хочу протестировать мое приложение angular с помощью транспортира. Приложение имеет модуль API, который взаимодействует с сервером Во время этих тестов я хочу издеваться над этим модулем Api. Я не хочу выполнять полные интеграционные тесты, но тесты с пользовательского ввода с ожидаемыми значениями из API. Это может не только ускорить проверку клиента, но и позволить мне проверять случаи кросс-ошибок, например, ошибки соединения.

Как я могу сделать это с помощью транспортира? Я только начал устанавливать интеграционные тесты.

Я использовал модуль транспортировщика npm, установил селен, скорректировал конфигурацию по умолчанию и использовал onProtractorRunner.js, чтобы проверить, что мои настройки работают.

Каков рекомендуемый способ насмешки? Я предполагаю, что насмешка должна выполняться в браузере, а не непосредственно в тестовом файле. Я предполагаю, что команды в тестовом файле имеют специфический характер транспортира и будут отправляться на селеневые бегуны. Поэтому я не могу разделить объекты javascript во время сеанса и теста.

Я как-то ожидаю, что мне понадобится библиотека шпиона, например sinon.js или это уже включено в транспортир?

Изменить: Я читал о этой проблеме в трекер-проблеме протрансформатора, что может быть способом сделать это. В основном вы пишете модуль Mock в тесте, который отправляется для выполнения в области браузера/приложения.

Изменить: Вот более перспективные проблемы. Первые сообщения о добавлении Mocks в приложение angular. Второй разговор о насмехается с бэкэндом.

Это выглядит очень хорошо, в этом случае приложение angular останется в нем оригинальной формой. Однако в настоящее время это работает только с устаревшими ng-сценариями.

4b9b3361

Ответ 1

В этом сообщении в блоге обсуждаются сценарии использования Advractor. В частности, он охватывает малоизвестный метод addMockModule() объекта браузера Protractor. Этот метод позволяет вам создавать модули angular в Protractor (т.е. Mocks или stubs вашего API-модуля) и загружать их в браузер, чтобы заменить реальную реализацию в контексте данной спецификации или набора спецификаций.

Ответ 2

У вас нет доступа к $httpBackend, контроллерам или службам из теста транспортитора, поэтому идея состоит в создании еще одного модуля angular и его включения в браузере во время теста.

  beforeEach(function(){
    var httpBackendMock = function() {
      angular.module('httpBackendMock', ['ngMockE2E', 'myApp'])
        .run(function($httpBackend) {
          $httpBackend.whenPOST('/api/packages').respond(200, {} );
        })
    }
    browser.addMockModule('httpBackendMock', httpBackendMock)
  })

ngMockE2E позволяет создать фальшивую реализацию для вашего приложения. Вот более подробное сообщение на тему http://product.moveline.com/testing-angular-apps-end-to-end-with-protractor.html

Ответ 3

Хотя я и не пробовал себя в этот момент, Angular предоставляет mock $httpBackend для тестов E2E:

http://docs.angularjs.org/api/ngMockE2E/service/$httpBackend

Итак, взяв с указанной выше страницы документов, я подозреваю, что перед вашими испытаниями вы можете использовать что-то вроде следующего:

beforeEach(function() {
  $httpBackend.whenGET('/remote-url').respond(edgeCaseData);
});

Ответ 4

Я создал небольшой настраиваемый модульный модуль, который поможет мне обрабатывать сценарии успеха и ошибок, возможно, это поможет вам лучше организовать насмешку.

https://github.com/unDemian/protractor-mock

Ответ 5

Я пытаюсь высмеять некоторые сервисы в транспортимере, и, посмотрев несколько блогов, я пришел к решению, которое работает для меня. Идея заключается не в том, чтобы тяжело насмехаться, просто генерировать некоторые ответы об ошибках; потому что для светильников у меня уже есть бэкдор на моем сервере API, чтобы заполнить бэкэнд.

В этом решении используется $provide.decorator(), чтобы просто изменить некоторые методы. Вот как он использовался в тестах:

it('should mock a service', function () {
    app.mock.decorateService({
        // This will return a rejected promise when calling to "user"
        // service "login()" method resolved with the given object.
        // rejectPromise() is a convenience method
        user: app.mock.rejectPromise('login', { type: 'MockError' }),

        // You can decorate the service
        // Warning! This code get stringified and send to the browser
        // it does not have access to node
        api: function ($delegate, $q) {
            $delegate.get = function () {
                var deferred = $q.defer();

                deferred.resolve({ id: 'whatever', name: 'tess' });

                return defer.promise;
            };

            return $delegate;
        },

        // Internally decorateService converts the function to string
        // so if you prefer you can set an string. Usefull for creating your
        // own helper methods like "rejectPromise()".
        dialog: [
            "function ($delegate, $window) {",
                "$delegate.alert = $window.alert;",
                "return $delegate;",
            "}"
        ].join('\n')
    });

    // ...

    // Important!
    app.mock.clearDecorators();
});

Здесь код:

App.prototype.mock = {
    // This must be called before ".get()"
    decorateService: function (services) {
        var code = [
            'var decorer = angular.module("serviceDecorator", ["visitaste"]);',
            'decorer.config(function ($provide) {'
        ];

        for (var service in services) {
            var fn = services[service];

            if (_.isFunction(fn)) {
                code.push('$provide.decorator("'+ service +'", '+ String(fn) +');');
            } else if (_.isString(fn)) {
                code.push('$provide.decorator("'+ service +'", '+ fn +');');
            }
        }

        code.push('});');

        browser.addMockModule('serviceDecorator', code.join('\n'));
    },
    clearDecorators: function () {
        browser.clearMockModules();
    },
    rejectPromise: function (method, error, delay) {
        return [
            'function ($delegate, $q) {',
                '$delegate.'+ method +' = function () {',
                    'var deferred = $q.defer();',
                    '',
                    'setTimeout(function () {',
                        'deferred.reject('+ JSON.stringify(error) +');',
                    '}, '+ (delay || 200) +');',
                    '',
                    'return deferred.promise;',
                '};',
                '',
                'return $delegate;',
            '}'
        ].join('\n');
    }
};

Ответ 6

Точкой запуска сквозных тестов с помощью транспортира является проверка того, что приложение работает при интеграции. Если вы пытаетесь протестировать свои элементы ui в изоляции, проще использовать небольшие элементы из обычных тестов. Точно так же, как сам AngularJS проверяет директивы.

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

Ответ 7

Вот еще несколько параметров для заглушения HTTP-сервера:

  • Stubby небольшой веб-сервер с поддержкой node,.Net и Java. Вам понадобится его для установки и размещения.
  • Apiary размещенная служба для создания фальшивого API. Вы также можете использовать его для создания документации API.