我的一项测试期望错误消息文本是多个值之一。由于 getText() 返回一个 promise ,我不能使用 toContain() Jasmine 匹配器。以下将不起作用,因为 protractor(jasminewd 引擎盖下)不会解决匹配器第二部分中的 promise ,在这种情况下为 toContain():

expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText());

问题: 有没有办法用 Jasmine + Protractor 检查一个元素是否在一个数组中,其中一个元素是一个 promise ?

换句话说,我正在寻找 toContain() 的倒数,以便 expect() 将隐式解析传入的 promise 。

作为一种解决方法,我可以使用 then() 明确解决 promise :
page.errorMessage.getText().then(function (text) {
    expect(["Unknown Error", "Connection Error"]).toContain(text);
});

我不确定这是否是最好的选择。我也可以接受基于第三方的解决方案,例如 jasmine-matchers

例如,这种断言存在于 Python 中:
self.assertIn(1, [1, 2, 3, 4])

最佳答案

看起来您需要一个自定义匹配器。根据您使用的 Jasmine 版本:

Jasmine 1:

this.addMatchers({
    toBeIn: function(expected) {
        var possibilities = Array.isArray(expected) ? expected : [expected];
        return possibilities.indexOf(this.actual) > -1;
    }
});

Jasmine 2:
this.addMatchers({
    toBeIn: function(util, customEqualityTesters) {
        return {
            compare: function(actual, expected) {
                var possibilities = Array.isArray(expected) ? expected : [expected];
                var passed = possibilities.indexOf(actual) > -1;

                return {
                    pass: passed,
                    message: 'Expected [' + possibilities.join(', ') + ']' + (passed ? ' not' : '') + ' to contain ' + actual
                };
            }
        };
    }
});

您必须在将要使用的每个 beforeEach 块的 describe 部分中执行此操作。

你的期望看起来像:
expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]);

关于javascript - 期望数组中的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28747161/

10-13 02:19