Как передать целочисленные значения в тесте на огурец и проверить результат - PullRequest
0 голосов
/ 13 ноября 2018

Как я вызываю простую функцию сложения и утверждаю результат двух значений, используя selenium-cucumber-js framework с тестом, написанным ниже. При запуске ниже это говорит TypeError: TypeError: Невозможно прочитать свойство 'addvalues' из неопределенного at createWorld.When (C: \ Tests \ cucumber \ step-definitions \ addvalues-steps.js: 5: 25)

Feature:
 Scenario: Addition of two values   
        When Add two values 5 and 10
        Then I should get result 15

// Вот мой файл 'addvalues-steps.js'

const expect = require('chai').expect;
module.exports = function () {  

    this.When(/^Add two values (-?\d+) and (-?\d+)$/, (x, y) =>{
        this.page.addvalues.addValues(x,y); 
    })

    this.Then(/^I should get result (-?\d+)$/, (ans) =>{
    let tot =  this.page.addvalues.addValues(x, y); 
        expect(tot).to.be.eql(ans);     
    })
};

// Ниже приведен мой 'файл addvalues.js'

module.exports = {    
   addValues(x,y){
    var total = x + y ;   
    return  total ;        
     }  
};

// world.js >>

const { CustomWorld } = require('cucumber')
function CustomWorld() {
    console.log('overriding the world')
    this.page = {
        addvalues: require('../page-objects/addvalues')
    }
    console.log("This is the recent error log:"+this.page.addvalues)        

}

module.exports = function() {
    this.World = CustomWorld;

enter image description here

1 Ответ

0 голосов
/ 13 ноября 2018

Примечание : приведенный ниже пример для старой версии cucumber-js: 1.3.3. С cucumber.js, когда вы ссылаетесь на this изнутри определений шагов, вы фактически ссылаетесь на контекст World. Таким образом, для правильной работы this.page.addvalues.addValues(x,y); сначала необходимо создать page, который имеет ссылку на ваш addvalues.js. Что-то вроде этого:

world.js:

function CustomWorld() {
    console.log('overriding the world')
    this.page = {
        addvalues: require('../page-objects/addvalues')
    }
}

module.exports = function() {
    this.World = CustomWorld;
};

addvalues.js:

//addvalues.js
module.exports = {
    addValues(x,y){
        var total = x + y ;
        return  total ;
    }
};

В вашем steps.js.

также есть пара вещей, которые нужно исправить.
  1. Не передавайте функции стрелок в действия, так как это удалит контекст this, который вы устанавливаете в World.js.
  2. Если вы хотите разделить переменные между шагами (как вы делаете в вашем примере), вам нужно где-то их хранить. Одним из таких мест, опять же, был бы контекст мира. Обратите внимание, как в моей версии я установил this.prevResult
  3. Когда переменные вводятся в ваши шаги, они вводятся как строки. Обратите внимание на parseInt() в моей версии.

addvalues-steps.js:

const expect = require('chai').expect;

module.exports = function() {
    this.When(/^Add two values (-?\d+) and (-?\d+)$/, function (x, y) {
        this.prevResult = this.page.addvalues.addValues(parseInt(x, 10), parseInt(y, 10));
    })

    this.Then(/^I should get result (-?\d+)$/, function (ans) {
        let tot = this.prevResult;
        expect(tot).to.be.eql(parseInt(ans, 10));
    })
}

UPD: Оказывается, речь идет о selenium-cucumber-js , который является основой поверх cucumber-js. Не обращайте внимания на комментарии о world.js.

Согласно selenium-cucumber-js документам, вам не нужно this для доступа к объектам страницы в определениях ваших шагов:

Объекты страницы доступны через глобальный объект страницы и автоматически загружается с ./page-objects.

const expect = require('chai').expect;

module.exports = function() {
    this.When(/^Add two values (-?\d+) and (-?\d+)$/, function (x, y) {
        this.prevResult = page.addvalues.addValues(parseInt(x, 10), parseInt(y, 10));
    })

    this.Then(/^I should get result (-?\d+)$/, function (ans) {
        let tot = this.prevResult;
        expect(tot).to.be.eql(parseInt(ans, 10));
    })
}
...