5

casper.js の機能テストで少し問題があります。

最初は GET メソッドで、次に POST メソッドで、同じリソースを 2 回リクエストします。2 番目のリソース (POST) を待機しているときに、最初のリソースと一致し、「then」関数に直接移動します。

リソースを適切に識別できるように、「テスト」関数で 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]': 'test.bruce@im.com',
            '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');
    });

または、このシナリオをテストするためのより良い方法がありますか? ただし、これは機能テストであるため、これらすべてのステップを 1 つのテストに含める必要があります。

4

2 に答える 2

1

フォーム アクションの URL を変更してクエリ文字列を追加して、スタックに追加された新しいリソースを生成することができます。この方法で行うことができます:

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

ただし、これはハックであり、機能テストは決してその方法で達成されるべきではありません。将来、より多くの情報が応答オブジェクトに追加されることを期待しましょう。

于 2012-11-10T07:40:45.663 に答える
1

res関数に渡されるパラメーターにはIDtestがあります。この ID に対してテストしてブラックリストに登録するヘルパーを作成したので、同じリソースが 2 回目に受け入れられることはありません。

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;
            }
        };
    };
于 2012-11-09T08:44:44.883 に答える