今天,我遇到了一个有趣的问题,即创建测试非常简单的行为:'最近的' 排序。所有测试都需要知道:
方法:将ID写入项目的属性,使用getAttribute()
从第一项获取该ID,然后以任意方式获取第二项。
问题:getAttribute()
承诺产生字符串值,Jasmine无法比较(从框中)字符串数字。
我希望找到一种优雅的方法来将它们与toBeLessThan()
进行比较,而不是使用少量.then()
的链来完成比较。
Root of no-type-definition evil
谢谢大家< 3
答案 0 :(得分:4)
你可以创建一个帮助函数来将字符串数转换为实际数,这将使用Promises:
function toNumber(promiseOrValue) {
// if it is not a promise, then convert a value
if (!protractor.promise.isPromise(promiseOrValue)) {
return parseInt(promiseOrValue, 10);
}
// if promise - convert result to number
return promiseOrValue.then(function (stringNumber) {
return parseInt(stringNumber, 10);
});
}
然后将结果与.toBeLessThan
等一起使用:
expect(toNumber(itemId)).toBeLessThan(toNumber(anotherItemId));
答案 1 :(得分:2)
我忘记了承诺的本土性质,但是对于迈克尔·拉迪奥诺夫来说,我已经记得我想做什么。
expect(first.then( r => Number(r) )).toBe(next.then( r => Number(r) ));
我猜这个中风看起来很简单。
<强>更新强>
ES6:
it('should test numbers', async function () {
let first = Number(await $('#first').getText());
let second = Number(await $('#second').getText());
expect(first).toBeGreaterThan(second);
})
答案 2 :(得分:1)
使用自定义茉莉花匹配器来接近它的一个选项:
toBeSorted: function() {
return {
compare: function(actual) {
var expected = actual.slice().sort(function (a, b) {
return +a.localeCompare(+b);
});
return {
pass: jasmine.matchersUtil.equals(actual, expected)
};
}
};
},
这里匹配器采用实际的输入数组,对其进行整数排序并与输入数组进行比较。
用法:
expect(element.all(by.css(".myclass")).getAttribute("id")).toBeSorted();
请注意,我们在getAttribute("id")
上调用ElementArrayFinder
,它将解析为id
属性值数组。 expect()
本身被修补以隐含地解决承诺。