期待数组中的项目

ale*_*cxe 12 javascript testing promise jasmine protractor

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

expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText());
Run Code Online (Sandbox Code Playgroud)

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

换句话说,我正在寻找倒数,toContain()以便expect()隐含地解决传入的承诺.


作为一种解决方法,我可以通过以下方式明确解决承诺then():

page.errorMessage.getText().then(function (text) {
    expect(["Unknown Error", "Connection Error"]).toContain(text);
});
Run Code Online (Sandbox Code Playgroud)

我不确定这是不是最好的选择.我也可以使用基于第三方的解决方案jasmine-matchers.


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

self.assertIn(1, [1, 2, 3, 4]) 
Run Code Online (Sandbox Code Playgroud)

Del*_*kin 14

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

使用Jasmine 1:

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


使用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
                };
            }
        };
    }
});
Run Code Online (Sandbox Code Playgroud)


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

您的期望看起来像:

expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]);
Run Code Online (Sandbox Code Playgroud)


Mic*_*nov 7

另一种解决方案是使用.toMatch()带有正则表达式的匹配器,特别是一个特殊字符|(称为"或"),它只允许匹配一个条目:

expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/);
Run Code Online (Sandbox Code Playgroud)