2015-08-12 2 views
1

Я пытаюсь использовать CucumberJS с Selenium и PhantomJS. Я успешно провел built a World object using this StackOverflow answer в качестве руководства.Выполнение обратного вызова из CucumberJS с определением шага селена

Итак, теперь я тестирую некоторые базовые определения шага, но с некоторой путаницей о том, как выполнить обратный вызов в конце шага. Это прекрасно работает:

module.exports = function() { 
    this.World = require("../support/world.js").World; 

    this.Given(/^I am visiting Google$/, function (callback) { 
    this.driver.get('http://www.google.com') 
     .then(function() { 
      callback(); 
     }); 
    }); 
}; 

водитель попадет Google.com и обратный вызов не не стрелял, пока после загрузки запрашиваемого документа. Но я считаю, что этот синтаксис будет немного многословен, поэтому я подумал, что я мог бы просто пройти callback прямо к then() после моего первого обещания, например, так:

module.exports = function() { 
    this.World = require("../support/world.js").World; 

    this.Given(/^I am visiting Google$/, function (callback) { 
    this.driver.get('http://www.google.com') 
     .then(callback); 
    }); 
}; 

Это, однако не удается, и, кажется, console.log в callback , Вот вывод:

Scenario: Googling   # features/theGoogle.feature:6 
    Given I am visiting Google # features/theGoogle.feature:7 
     [object Object] 


    (::) failed steps (::) 

    [object Object] 

Что здесь происходит? Я ожидал, что callback может быть просто передан функции then() и выполнен после выполнения обещания. Почему его обертывание анонимной функцией заставляет его работать?

ответ

0

Происходит то, что callback вызывается с аргументами driver.get().then.

Другими словами, вот что происходит:

this.driver.get('http://www.google.com') 
    .then(function(result) { 
    callback(result); 
    }); 

Проблема заключается в том, что обратный вызов огурец будет считать неисправностью, если функция вызывается с чем-то в качестве первого параметра, так как предполагается, что ошибка как в callback(new Error('Something went wrong')).

Для меня этого было достаточно, чтобы полностью запретить использование обратных вызовов. Селен полностью ориентирован на обещание, и вы должны соблюдать обещание, только если хотите, чтобы ваша жизнь была проще. Это идеальный вариант, так как cucumber.js принимает обещает быть возвращен вместо обратного вызова, так что здесь это лучший способ сделать вещи:

// Be sure to omit the last parameter of the function, usually "callback" 
this.Given(/^I am visiting Google$/, function() { 
    return this.driver.get('http://www.google.com'); 
}); 

Стадию потерпит неудачу, если обещание в конце концов отвергнута, или продолжать в следующий шаг, если обещание будет заполнено. Но в обоих случаях огурец будет ждать последнего обещания, поэтому все, что вам нужно сделать, всегда возвращает последнее обещание любого шага, так как Selenium будет разрешать или отклонять последнее обещание после того, как предыдущие были разрешены. Все выглядит намного приятнее, не так ли?

Смежные вопросы