【问题标题】:Casper JS waitForResource with a restful APICasper JS waitForResource 带有一个宁静的 API
【发布时间】:2012-11-08 09:00:14
【问题描述】:

我们在使用 casper.js 进行功能测试时遇到了一点问题。

我们两次请求相同的资源,首先使用 GET,然后使用 POST 方法。 现在,当等待第二个资源(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');
    });

或者也许有更好的方法来测试这种情况?虽然这是一项功能测试,但我们需要将所有这些步骤都放在一个测试中。

【问题讨论】:

    标签: javascript functional-testing casperjs


    【解决方案1】:

    您可以尝试更改表单操作 url 以添加一些查询字符串,从而生成附加到堆栈的新资源。可以这样做:

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

    不过,这是一种 hack,永远不应该以这种方式实现功能测试。让我们希望将来能将更多信息添加到响应对象中。

    【讨论】:

      【解决方案2】:

      传递给test 函数的res 参数有一个ID。我创建了一个助手来测试这个 ID 并将其列入黑名单,因此同一资源不会被第二次接受。

      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;
                  }
              };
          };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-27
        • 2011-07-21
        • 2014-02-24
        • 2018-12-30
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        相关资源
        最近更新 更多