我们在使用casper.js进行功能测试时遇到了一些问题。
我们两次请求相同的资源,首先使用GET,然后使用POST方法。 现在,当等待第二个资源(POST)时,它与第一个资源匹配,并直接转到“then”函数。
我们希望能够在“test”函数中检查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');
});
或许有更好的方法来测试这种情况?虽然这是一个功能测试,但我们需要在一次测试中保留所有这些步骤。
答案 0 :(得分:1)
传递给res
函数的test
参数具有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;
}
};
};
答案 1 :(得分:1)
您可以尝试更改表单操作URL以添加一些查询字符串,从而生成附加到堆栈的新资源。可以这样做:
casper.thenEvaluate(function() {
var form = __utils__.findOne('#email_edit_form');
form.setAttribute('action', form.getAttribute('action') + '?plop');
});
虽然这是一个黑客攻击,但功能测试绝不应该以这种方式实现。我们希望将来能够在响应对象中添加更多信息。