量角器比较字符串数字

时间:2015-11-02 14:00:56

标签: string numbers compare jasmine protractor

今天,我遇到了一个有趣的问题,即创建测试非常简单的行为:'最近的' 排序。所有测试都需要知道:

  1. 每个项目都有ID
  2. 在此排序
  3. 的情况下,先前的ID少于下一个ID

    方法:将ID写入项目的属性,使用getAttribute()从第一项获取该ID,然后以任意方式获取第二项。

    问题getAttribute()承诺产生字符串值,Jasmine无法比较(从框中)字符串数字。

    我希望找到一种优雅的方法来将它们与toBeLessThan()进行比较,而不是使用少量.then()的链来完成比较。

    Root of no-type-definition evil

    谢谢大家< 3

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()本身被修补以隐含地解决承诺。