Пользовательский сопоставитель не утверждает в тесте Astrolabe/Protractor + Jasmine

Я пишу несколько тестов, управляемых объектами страниц, используя Protractor и Астролябия.

Jasmine используется для реализации спецификаций стиля describe/it.

Добавление пользовательских сопоставителей не будет работать с использованием this.addMatchers (TypeError: Object #<Object> has no method 'toContainLowered'), поэтому я использовал это руководство для их реализации.

Кажется, это работает, пока я не посмотрю внимательно на результаты моего тестового прогона:

$> grunt test:func
Running "test:func" (test) task

Running "shell:protractor" (shell) task
Using the selenium server at http://localhost:4444/wd/hub
..

Finished in 6.727 seconds
2 tests, 1 assertion, 0 failures

Вот мой код:

var loginPage = require('./../pages/loginPage');

describe('Login page', function () {

    var ptor = loginPage.driver;

    beforeEach(function () {
        jasmine.Matchers.prototype.toContainLowered = function (expected) {
            return this.actual.toLowerCase().indexOf(expected) > -1;
        };
        loginPage.go();
        ptor.waitForAngular();
    });

    it('should display login page', function () {
        expect(loginPage.currentUrl).toEqual(ptor.baseUrl);
    });

    it('should display an error when the username or password is incorrect', function() {
        loginPage.login('bad', 'credentials');
        ptor.waitForAngular();
        expect(loginPage.lblError.getText()).toContainLowered('invalid username and/or password');
        // expect(loginPage.lblError.getText()).toContain('Invalid Username and/or Password');
    });

});

Если я раскомментирую последнюю строку и удалю сопоставитель toContainLowered, я получу правильный вывод:

2 tests, 2 assertions, 0 failures

Мне очень трудно отлаживать этот код на основе обещаний, и любые попытки поставить console.log(this.actual.toLowerCase().indexOf(expected) > -1); будут печатать false, что сбивает с толку.

Я даже пытался заменить все определение функции только на return false;. Который все равно ничего не делает. Наконец, я попытался передать без аргумента сопоставителю, который должен был выдать ошибку Invalid Argument Error или что-то в этом роде.

Как мне определить свои собственные сопоставители в Jasmine при использовании тестов Protractor/Astrolabe?


person Droogans    schedule 18.10.2013    source источник


Ответы (1)


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

В моем случае я хотел .not.toMatch, и поэтому я просто написал запутанное регулярное выражение, которое дало мне то, что я хотел, без встроенного в регулярное выражение.

Я отмечаю, что ваш сопоставитель называется «toContainLowered», поэтому, возможно, вы ищете строчные буквы, и поэтому вы могли бы вместо этого сделать это с помощью регулярного выражения, используя .toMatch?

Проблема, которую я поднял по этому поводу на github транспортира, находится здесь: https://github.com/angular/protractor/issues/266

Я также вижу в этом файле кода: https://github.com/angular/protractor/blob/master/jasminewd/spec/adapterSpec.js, что последний коммит помечен как «исправленный сопоставитель не должен понимать». Это может либо исправить пользовательские сопоставители для вас, либо указать, что необходимо сделать, чтобы исправить этот пользовательский сопоставитель.

РЕДАКТИРОВАТЬ: теперь, изучая эту ветку проблемы, я вижу, что вы уже были там. Что делает мой ответ несколько излишним. :-)

person PaulL    schedule 18.11.2013
comment
Кроме того, исправлена ​​.not проблема. Теперь не матчеры должны работать. - person Droogans; 19.11.2013