量角器:出现错误但测试通过了

时间:2015-12-29 22:18:31

标签: javascript automated-tests protractor

我正在创建一个使用量角器和其他库(如柴,黄瓜和小黄瓜)的测试工具。我有三个文件:

  1. my_feature.feature - 用于指定小黄瓜功能
  2. test_step.js - 此文件包含步骤定义
  3. index.html - 是我正在测试的网页
  4. my_feature.feature

    # features/my_feature.feature
    
    Feature: Test cucumber automation
      As a front-end developer
      I want to automate e2e testing
    
    
      Scenario: Altro test
        Given I go on "file:///Users/Emanuele/Desktop/lavoro/test-automation/app/html/index.html"
        Then The text of the element with selector "#test-button" should be "My button"
    

    test_step.js

        'use strict';
    
    var chai = require('chai'),
        chaiAsPromised = require('chai-as-promised');
    
    chai.use(chaiAsPromised);
    
    var expect = chai.expect;
    
    // Protractor won't wait for Angular
    browser.ignoreSynchronization = true;
    
    module.exports = function() {
    
      this.World = require('../support/world').World;
    
      // default timeout for all step definitions
      this.setDefaultTimeout(20 * 1000);
    
      /*
      ** Open a page based on an absolute url
      ** Ex. https://www.google.com
      */
      this.Given(/^I go on "([^"]*)"$/, function(url, callback){
        browser.get(url);
    
        callback();
      });
    
      /*
      ** Check if the text of the element with a given selector is equal to myText.
      */
      this.Then(/^The text of the element with selector "([^"]*)" should be "([^"]*)"$/, function(elementSelector, myText, callback){
        var selectedElement = element(by.css(elementSelector));
    
        //Resolve the promise
        selectedElement.getText().then(function(text){
          expect(text).to.equal(myText);
        });
    
    
        callback();
      });
    };
    

    的index.html

    <html>
    <head></head>
    <body>
    
        <button id="test-button">Test button</button> 
    
    </body>
    </html>
    

    现在,当我运行测试时,我得到了一个奇怪的结果,因为给定方案的两个步骤都已通过,但由于expect(text).to.equal(myText);行,我在第二个步骤中出错。 这是因为根据小黄瓜功能,按钮内的文字应该是我的按钮,而不是测试按钮

    您可以在此处找到我的控制台中显示的结果: enter image description here

    我想知道为什么即使出现错误也会通过第二步?我认为测试应该失败,因为比较的字符串是不同的。我错了吗?我该如何避免这种行为?

    修改

    如果我使用eventually中的chai-as-promised来解决承诺,我会得到相同的结果。所有测试都通过但错误文本略有不同:AssertionError: expected 'Test button' to equal 'My Button'

    提前谢谢。

3 个答案:

答案 0 :(得分:2)

我发现了两个解决此问题的方法。

<强>首先

selectedElement.getText().then(function(text){
      try{
        expect(text).to.equal(myText); 
      } catch(error){
        callback(new Error("Compare error"));
      }
      callback(); 
});

这里我解析了promise,然后检查元素的文本是否等于字符串myText。我不喜欢这个解决方案,因为,手动解决承诺,我没有使用chai-as-promised的很多功能。

<强>第二

expect(selectedElement.getText()).to.eventually.equal(myText).notify(callback); 

我认为这是最好的解决方案,并且基于由chai-as-promise提供的notify。 这个关于黄瓜量角器的 post对这个问题非常有帮助。

答案 1 :(得分:1)

这里发生的是因为你的断言是在异步操作的回调中,测试在遇到expect(text).to.equal(myText);语句之前就完成了,因此传递了。

您需要确定测试不应该通过,直到您等待的承诺得到解决!

根据我认为你应该使用的Chai documentation on promises模式是:

expect(selectedElement.getText()).to.eventually.equal(myTest);

答案 2 :(得分:1)

getText(),正如Protractor中的许多其他方法一样,返回承诺,使用chai-as-promised及其最终&#34;&#34; #34;:

expect(selectedElement.getText()).to.eventually.equal(myText);

而且,您在HTML中显然有Test button,但由于某种原因,您希望看到My button。换句话说,不应该是:

Then The text of the element with selector "#test-button" should be "Test button"