期望失败:"预期[]为空数组."

ale*_*cxe 6 javascript testing jasmine protractor jasmine-matchers

这是失败的测试:

describe("Checking errors", function () {
    var scope = {};

    beforeEach(function () {
        browser.get("/#endpoint");
        browser.waitForAngular();

        scope.page = new MyPage();
    });

    it("should not show any errors", function () {
        expect(scope.page.errors).toBeEmptyArray();
    });
});
Run Code Online (Sandbox Code Playgroud)

这里MyPage是一个Page对象:

var MyPage = function () {
    this.errors = element.all(by.css("div.error-block b.error"))
        .filter(function (elm) {
            return elm.isDisplayed().then(function (value) {
                return value;
            });
        })
        .map(function (elm) {
            return elm.getText();
        });
};

module.exports = MyPage;
Run Code Online (Sandbox Code Playgroud)

这里errors应该是可见的错误文本的阵列在网页上找到.

这是我们得到的错误:

Failures:

  1) Checking errors should not show any errors
   Message:
     Expected [  ] to be empty array.
   Stacktrace:
     Error: Failed expectation
Run Code Online (Sandbox Code Playgroud)

仅供参考,toBeEmptyArray()匹配器来自jasmine-matchers第三方.


我试图打印出scope.page.errors这种方式的价值:

scope.page.errors.then(function (errors) {
    console.log(errors);
});
Run Code Online (Sandbox Code Playgroud)

并打印出来[].Array.isArray(errors)回报true.

从我看来,scope.page.errors是一个空数组,但期望失败.我错过了什么?

小智 3

答案是量角器 src中的四行。

ElementArrayFinder extends Promise,而 jasmine-matchers 检查首先检查错误是否是一个实际的数组,以及Array.isArray 是如何完成的,这将返回 false;

这也与expect(scope.page.errors.length).toBe(0)未定义一致,因为承诺没有长度。

只需运行errors.then你的诺言,并测试参数是否为 [] 你还表明,当你运行时可以完成scope.page.errors.then