В Cucumber функция обратного вызова получает тайм-аут, хотя вызывается обратный вызов.Уже увеличен DefaultTimeout, но все еще ошибка - PullRequest
0 голосов
/ 23 января 2019

Ниже приведено определение шага по огурцу, и в этом вызове функция () была успешно нажата, и она смогла увидеть строку консоли, т. Е. «Это функция обратного вызова»

const assert = require('assert')
const {
	Before,
	Given,
	When,
	Then
} = require('cucumber');

var {
	setDefaultTimeout
} = require('cucumber');

setDefaultTimeout(6 * 1000);


Given('This has only one word {string}', function (string, callback) {
	console.log(string);

	function callback() {}
	callback();
});

Но этот шаг не завершается, выдает ошибку «Тайм-аут функции, убедитесь, что обратный вызов выполнен в течение 6000 миллисекунд»

C:\Users\Mohit.Garg\Desktop\Cucumber practice\example5>protractor conf.js
[17:14:55] I/launcher - Running 1 instances of WebDriver
[17:14:55] I/local - Starting selenium standalone server...
[17:14:57] I/local - Selenium standalone server started at http://10.200.3.79:55733/wd/hub
(node:27784) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
Feature: Login

  Scenario: Login
    Given This has only one word "hi"
This is a callback function
    × failed
      Error: function timed out, ensure the callback is executed within 6000 milliseconds
          at Timeout._onTimeout (C:\Users\Mohit.Garg\Desktop\Cucumber practice\example5\node_modules\cucumber\src\user_code_runner.js:61:18)
          at ontimeout (timers.js:436:11)
          at tryOnTimeout (timers.js:300:5)
          at listOnTimeout (timers.js:263:5)
          at Timer.processTimers (timers.js:223:10)

Я не думаю, что это связано с DefaultTimeout, потому что, если я использую приведенный ниже код с тем же значением Timeout, он работает отлично. Я заменил «обратный вызов» в Given с другим именем «newcallback» и вызвал внутри функцию обратного вызова в конце. Смотри ниже

Given('This has only one word {string}', function (string, newcallback) {
	console.log(string);

	function callback() {
		newcallback()
	}
	callback();
});

Надеюсь, с моей проблемой все ясно, ваша помощь очень ценится.

1 Ответ

0 голосов
/ 24 января 2019

1) Если внутри функции шага нет асинхронного кода, нет необходимости использовать аргумент callback.

Then(/^the response status is (.*)$/, function (status) {
  // Synchronous code
  assert.equal(this.responseStatus, status)
});

2) Но если внутри функции шага есть какой-либо асинхронный код, вынужно использовать аргумент callback или вернуть обещание.

Например:

Given('This has only one word {string}', function (string, callback) {
   // the `callback` is specified by argument: callback

   ... do other things
   // when step done invoke the `callback`
   callback()
}

Given('This has only one word {string}', function (string, abc) {
   // the `callback` is specified by argument: abc

   ... do other things
   // when step done invoke the `callback`
   abc()
}

Given('This has only {amount} word {string}', function (amount, string, xyz) {
   // the `callback` is specified by argument: xyz

   ... do other things
   // when step done invoke the `callback`
   xyz()
}

Важно : последний аргумент функции в Cucumber будет задан как callback, независимо от того, какое имя аргумента вы дадитестрока.

// Asynchronous - callback
// Take a callback as an additional argument to execute when the step is done
Then(/^the file named (.*) is empty$/, function (fileName, callback) {

  fs.readFile(fileName, 'utf8', function(error, contents) {
    if (error) {
      callback(error);
    } else {
      assert.equal(contents, '');
      callback();
    }
  });
});

// Asynchronous - promise
// Return a promise. The step is done when the promise resolves or rejects
When(/^I view my profile$/, function () {
  // Assuming this.driver is a selenium webdriver
  return this.driver.findElement({css: '.profile-link'}).then(function(element) {
    return element.click();
  });
});

Вернуться к вашему коду:

Given('This has only one word {string}', function (string, callback) {
    console.log(string);
    // the `callback` specified by argument: callback   

    function callback() {} 
    // you define a function, named 'callback' too, which overwrite the
    // real `callback`

    callback();
    // you invoked the function you defined, not the real `callback`,
    // so cucumber wait the real `callback` be invoked, until reach
    // the timeout, then report timeout exception. 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...