期待数组中的项目

时间:2015-02-26 16:05:28

标签: javascript testing jasmine promise protractor

我的一个测试期望错误消息文本是多个值之一。由于 getText()会返回一个承诺,因此我无法使用toContain() jasmine matcher。以下内容无法正常工作,因为protractorjasminewd引擎盖下)无法解析匹配器第二部分中的承诺,toContain()在这种情况下:

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

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

换句话说,我正在寻找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]) 

3 个答案:

答案 0 :(得分:14)

看起来你需要一个自定义匹配器。取决于您使用的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"]);

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

对我而言,您确定的 解决方法 是最佳解决方案。但是,我们不应忘记这是 异步执行 ,您可能需要考虑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断言)并且可能导致混淆。