2015-03-18 51 views
6

这里是失败的测试:失败期望:“预期[]为空阵列。”

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

其中MyPagePage对象

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是一个空数组,但期望失败。我错过了什么?

+0

什么,如果你登录Array.isArray(你会做错误)? – Ryan 2015-03-18 23:12:59

+0

@Ryan并不期待这一点,但它打印出'真实'......很奇怪。谢谢。 – alecxe 2015-03-18 23:15:46

+0

'expect(scope.page.errors.length).toBe(0);'工作吗?您可能会遇到webdriver创建的范围(如页面中的iframe)中有自己的“Array”定义的问题。请参阅http://stackoverflow.com/a/2265999/960524(这可能是'toBeEmptyArray()'方法中的一个错误 - 它可能会失败检查的“数组”部分。) – 2015-03-18 23:36:26

回答

3

答案是在protractor src下四行。

ElementArrayFinder extends Promise,而茉莉花匹配器检查first checks错误是一个实际的数组完全如何Array.isArray is done,这将返回false;

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

对你的承诺,只要运行errors.then,并测试参数是[] 你还表明,可以在您运行scope.page.errors.then

+0

谢谢,这是我所怀疑的(见评论)。尽管用'then()解析'scope.page.errors'并没有帮助:当使用下面的代码时'Expected []为空array.':scope.page.errors.then(function(errors) {expect(errors).toBeEmptyArray();});'。 – alecxe 2015-04-08 16:21:35

+0

换句话说,即使解决的值不是数组,它看起来像一个数组,但它不是(忘记“鸭”的原则:))。但是,现在我有一个解决方法 - 我从“几乎一个数组”中取出一个数组:'expect([]。concat(errors))。toBeEmptyArray();'。无论如何都值+1。 – alecxe 2015-04-08 19:25:25

+0

不幸的是,他们的实现不通过测试对象的toString来遵循'鸭'原则 – 2015-04-16 00:43:45

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

谢谢参与,尽管它没有回答这个问题。 – alecxe 2015-04-08 16:35:24