【问题标题】:Failed expectation: "Expected [ ] to be empty array."预期失败:“预期 [ ] 为空数组。”
【发布时间】:2015-05-21 22:45:48
【问题描述】:

这是失败的测试:

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();
    });
});

其中MyPage 是一个页面对象

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;

errors 应该是 在页面上找到的可见错误文本数组

这是我们得到的错误:

Failures:

  1) Checking errors should not show any errors
   Message:
     Expected [  ] to be empty array.
   Stacktrace:
     Error: Failed expectation

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


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

scope.page.errors.then(function (errors) {
    console.log(errors);
});

并打印为[]Array.isArray(errors) 返回true

据我所知,scope.page.errors 是一个空数组,但期望失败。我错过了什么?

【问题讨论】:

  • 如果记录 Array.isArray(errors) 会得到什么?
  • @Ryan 没想到会这样,但它会打印出true..weird。谢谢。
  • expect(scope.page.errors.length).toBe(0); 有效吗?您可能会在 webdriver 创建的范围(如页面中的 iframe)中遇到问题,这些范围具有自己的“数组”定义。请参阅stackoverflow.com/a/2265999/960524(所以这可能是toBeEmptyArray() 方法中的一个错误——它可能未能通过检查的“数组”部分。)
  • @P.T.谢谢你的观点,你发布的期望因Expected undefined to be 0 而失败。我实际上怀疑这与ElementArrayFinder..this particular comment 可能与我们正在经历的事情有关:You can treat an ElementArrayFinder as an array of WebElements for most purposes...
  • expect(scope.page.errors).toBeArray(); 通过了吗?

标签: javascript testing jasmine protractor jasmine-matchers


【解决方案1】:

答案是protractor src 中的四行。

ElementArrayFinder extends Promise,而 jasmine-matchers 检查 first checks 错误是一个实际数组,与 Array.isArray is done 完全相同,它将返回 false;

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

只需按照您的承诺运行errors.then,并测试参数是否为 [] 你还证明了当你运行scope.page.errors.then时可以做到这一点

【讨论】:

  • 谢谢,这就是我所怀疑的(参见 cmets)。但是,使用 then() 解析 scope.page.errors 并没有帮助:Expected [ ] to be empty array. 使用以下代码时:scope.page.errors.then(function (errors) { expect(errors).toBeEmptyArray(); });
  • 换句话说,即使解析的值也不是数组,它看起来像数组但实际上不是(忘记“鸭子”原理:))。但是,现在我有一个解决方法 - 我正在用“几乎是一个数组”制作一个数组:expect([].concat(errors)).toBeEmptyArray();。无论如何都值得 +1。
  • 不幸的是,他们的实现并没有通过测试对象的 toString 来遵循 'duck' 原则
【解决方案2】:
Inside test script your code line "scope.page = new MyPage();" is creating new empty MyPage object.Code which you have written in application script is creating page object locally and its not bounded with any angular scope.When there is requirement of testing such objects you need to replicate code for page object creation in beforeEach(); block of test script.And test it.
 describe("Checking errors", function () {
    var scope = {};
     var MyPage ;
    beforeEach(function () {
        browser.get("/#endpoint");
        browser.waitForAngular();

       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();
        });
};
    });

    it("should not show any errors", function () {
        expect(MyPage.errors).toBeEmptyArray();
    });
});

【讨论】:

  • 感谢您的参与,虽然它没有回答问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多