期望数组中的项目

Expect item in array

我的一个测试要求错误消息文本是多个值之一。由于 getText() returns promise 我不能使用 toContain() 茉莉匹配器。以下将不起作用,因为 protractorjasminewd 底层)不会解决匹配器第二部分中的承诺,在这种情况下为 toContain()

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

问题:有没有办法检查一个元素是否在一个带有 jasmine+protractor 的数组中,其中一个元素是一个 promise?

换句话说,我正在寻找 toContain() 的逆函数,以便 expect() 隐式解析传入的承诺。


作为变通方法,我可以使用 then():

显式解决承诺
page.errorMessage.getText().then(function (text) {
    expect(["Unknown Error", "Connection Error"]).toContain(text);
});

我不确定这是否是最佳选择。我也可以接受基于 jasmine-matchers.

等第三方的解决方案

例如,这种断言存在于Python:

self.assertIn(1, [1, 2, 3, 4]) 

看来您需要自定义匹配器。取决于您使用的 Jasmine 版本:

与茉莉花 1:

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


与茉莉花 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
                };
            }
        };
    }
});


您必须在每个 describe 块的 beforeEach 部分执行此操作。

你的期望看起来像:

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

另一种解决方案是将 .toMatch() 匹配器与 Regular Expressions 一起使用,特别是一个特殊字符 |(称为 "or" ), 只允许匹配一个条目成功:

expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/);

对我来说,您确定的解决方法是最佳解决方案。但是,我们不应该忘记这是一个 异步执行 并且您可能需要考虑 Jasmine's asynchronous support.

然后,您的测试将如下所示:

it('should check item is in array', function(done){ //Note the argument for callback

    // do your stuff/prerequisites for the spec here

    page.errorMessage.getText().then(function (text) {
        expect(["Unknown Error", "Connection Error"]).toContain(text);
        done(); // Spec is done! 
    });
});

注意: 如果您不将此 done 参数传递给 spec callback,它将 运行 完成而不会失败,但不会在该规范的执行结果中报告任何断言(换句话说,该规范将有 0 个断言),这可能会导致混淆。