Библиотека тестов совместно используется модульным тестом Karma и тестом Protractor. - PullRequest
0 голосов
/ 27 ноября 2018

У нас есть библиотека разработки пользовательского интерфейса, состоящая из виджетов, построенных на основе Angular JS.Давайте в качестве примера выберем «header-widget» - контейнер заголовков, созданный с помощью Angular JS, но с особыми функциональными возможностями, если он есть.

Скажем, HTML-код этого виджета будет выглядеть так:

<header class="my-header">
    <div ng-if="configuration.hasTitle">
        <h1 class="my-header-title-text">
            <span class="my-header-title-text">This is a main title</span>
            <span class="my-header-subtitle-text">This is a subtitle</span>
        </h1>
    </div>
</header>

Я могу создать юнит / интеграционный тест, используя Karma, т.е. в один момент у меня будет что-то вроде этого:

element = angular.element("<header config=\"config\"></header>");
$compile(element)(myScope);
myScope.$digest();

expect(element.find(".my-header-title-text").text().trim()).toBe("This is a main title");

, и я могу создать сквозной тест с использованием Protractor, т.е. в одной точкеУ меня будет что-то вроде этого:

describe('Some end to end spec', function () {
    it('should have the right title', function () {
        let title = element(by.css(".my-header .my-header-title-text"));
        expect(title.getText()).toMatch("This is a main title");
    });
});

Предположим, разработчики меняют заголовок, и новый класс для заголовка становится "my-header-MAIN-title-text".Я должен был бы пойти во все места в модульных / интеграционных тестах, а также в сквозных тестах, чтобы исправить это.

(Ради этого примера изменение тривиально и теоретически может быть заключено в капсулуимея селекторы в отдельных файлах, но на практике я говорю о более значительных изменениях в структуре DOM этих виджетов и т. д.)

Я хочу построить тестовую библиотеку - как тестовый API - поверх виджетов,Слой инкапсуляции, который будет предлагать мне такие вещи, как header.getTitle () и header.getSubtitle () - которые я могу использовать как в юнитах / интеграциях (Карма), так и в сквозном мире (Protractor).Таким образом, если произойдет изменение, подобное упомянутому выше, я должен пойти в одном месте, исправить реализацию "header.getTitle", и ни один из тестов не должен заботиться.

Для этого, Я создал что-то вроде этого (с использованием TypeScript):

import $ from "jquery";

export class MyHeaderImpl implements MyHeadear {
    private selector;

    constructor(element) {
        this.selector = $(element);
    }

    getTitle(): string {
        return this.selector.find(".my-header-title-text").text().trim();
    }

    getSubtitle(): string {
        return this.selector.find(".my-header-subtitle-text").text().trim();
    }
}

Он отлично работает для моих юнит / интеграционных тестов (Карма):

element = angular.element("<header config=\"config\"></header>");
$compile(element)(myScope);
myScope.$digest();

const header = ComponentFactory.createHeader(element);
expect(header.getTitle()).toBe("This is a main title");

Однако он не будет работать наТранспортир:

describe('Some end to end spec', function () {
    it('should have the right title', function () {
        let element = element(by.css(".my-header .my-header-title-text"));
        const header = ComponentFactory.createHeader(element);
        expect(title.getText()).toMatch("This is a main title");
    });
});

Выдает следующее исключение

Failed: jquery_1.default is not a function

Я использую TypeScript в библиотеке тестов, а также в моих тестах Транспортир.

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

Кто-нибудь знает, как я могу создатьтакая библиотека API тестов, которая может использоваться как в тестах Karma, так и в тестах Protractor?

Одно из лучших описаний, которое я мог найти здесь, в Переполнении стека , но это не такansweМой вопрос.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

@ factor5 , вот мой ответ на ваше предложение, поскольку раздел комментариев не позволяет этого.

Сначала позвольте мне сформулировать мой вопрос следующим образом:

есть способ написать (TypeScript) метод, который принимает оба:

  1. Угловой элемент (https://docs.angularjs.org/api/ng/function/angular.element)
  2. Элемент транспортира (https://www.protractortest.org/#/api?view=ElementFinder)

, а затем заглядывает внутрь заданного элемента, находит div и возвращает его текст. Если я определю этот аргумент элемента как угловой, я не смогу повторно использовать его в сквозном проекте транспортира. Если я определю этот аргумент элемента как "import {element} from protractor ", это заставит мои модульные / интеграционные тесты быть фактически сквозными, проходя через WebDriver.

Во-вторых, о шаблоне Page Object: я иду на один уровень ниже шаблона Page Object.Давайте возьмем текстовую область комментария, где я сейчас набираю свой ответ.

<div class="js-comment-text-input-container">
    <textarea></textarea>
</div>

У меня может быть объект Page с именем QuestionPage, с методом typeComment (), или даже отдельный компонент (PageObject)называется CommentSection, где я размещаю такие методы, как typeComment (), sendComment (), editComment () и т. д.

Но они могут использоваться во многих других местах, например, на странице, где пользователь может добавить короткую биографию.о и т. д. Будет объект Page с именем UserProfile, который имеет typeBio (), с которым также имеет дело.

На данный момент, если структура изменений, у вас уже есть два места, где вы должныиди и меняй.

Поэтому мне нужна отдельная библиотека для изоляции взаимодействия с такими элементами.

0 голосов
/ 27 ноября 2018

Вы пытались вставить библиотеку в карму и использовать ее напрямую без импорта.Я думаю, что есть множество адаптеров для кармы.В транспортире вы можете сделать то же самое в конфигурации транспортира.Тестовый API, который вы описали, называется шаблоном Page Object, кстати, я не уверен, стоит ли смешивать оба типа тестов в одной спецификации.

...