Casper JS waitForResource с спокойным API

У нас небольшая проблема с функциональным тестом с casper.js.

Мы запрашиваем один и тот же ресурс дважды, сначала методом GET, а затем методом POST. Теперь при ожидании второго ресурса (POST) он соответствует первому ресурсу и напрямую переходит к функции «затем».

Мы хотели бы иметь возможность проверить метод HTTP в функции «тест», чтобы мы могли правильно идентифицировать ресурс. Пока мы используем код состояния (res.status), но это не решает нашу проблему полностью, нам действительно нужен метод http.

// create new email
this.click(xPath('//div[@id="tab-content"]//a[@class="button create"]'));

// GET
this.waitForResource('/some/resource', 
    function then() {
        this.test.assertExists(xPath('//form[@id="email_edit_form"]'), 'Email edit form is there');

        this.fill('form#email_edit_form', {
            'email_entity[email]': '[email protected]',
            'email_entity[isMain]': 1
        }, true);

        // POST
        this.waitForResource(
            function test(res) {
                return res.url.search('/some/resource') !== -1 && res.status === 201;
            },
            function then() {
                this.test.assert(true, 'Email creation worked.');
            },
            function timeout() {
                this.test.fail('Email creation did not work.');
            }
        );
    },
    function timeout() {
        this.test.fail('Email adress creation form has not been loaded');
    });

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


person Reto Ryter    schedule 08.11.2012    source источник


Ответы (2)


Вы можете попытаться изменить URL-адрес действия формы, чтобы добавить строку запроса, тем самым создав новый ресурс, добавленный в стек. Можно сделать так:

casper.thenEvaluate(function() {
    var form = __utils__.findOne('#email_edit_form');
    form.setAttribute('action', form.getAttribute('action') + '?plop');
});

Однако это хак, и функциональное тестирование никогда не должно проводиться таким образом. Будем надеяться, что в будущем к объектам ответа будет добавлено больше информации.

person NiKo    schedule 10.11.2012

Параметр res, передаваемый функции test, имеет идентификатор. Я создал помощник, который проверяет этот идентификатор и заносит его в черный список, чтобы тот же ресурс не был принят во второй раз.

var blackListedResourceIds = [],
    testUniqueResource = function (resourceUrl, statusCode) {
        return function (res) {
            // check if resource was already loaded
            var resourceFound = res.url.search(resourceUrl) !== -1;

            // check statuscode
            if (statusCode !== undefined) {
                resourceFound = resourceFound && res.status === statusCode;
            }

            // check blacklisting
            if (!resourceFound || blackListedResourceIds[res.id] !== undefined) {
                return false;
            } else {
                blackListedResourceIds[res.id] = true;
                return true;
            }
        };
    };
person elHornair    schedule 09.11.2012