[Огурец] Рубиновые константы странного поведения - PullRequest
0 голосов
/ 29 мая 2018

Я обнаружил довольно странное поведение, которое сам не могу объяснить.Похоже, если вы используете Cucumber и Constants одновременно, Ruby сохранит локальные переменные между сценариями.В файле Cucumber test.feature у меня есть такие шаги

    Feature: Test

  Scenario Outline: Test outline
    Given Set data
      |user_id  |hash  |
      |<user_id>|<hash>|

    Examples:
      |user_id|hash|
      |king   |xfgh|

  Scenario Outline: What is going on
    Given Set data
      |shop_id|
      |<shop_id>|

    Examples:
      |shop_id|
      |554    |

Чем у меня есть файл steps.rb, например:

   Given(/^Set data$/) do |table|
  # table is a table.hashes.keys # => [:smth]
  temp = Constants::Cons.dup
  table.hashes[0].each do |key, values|
    temp[:bodyData][eval(":#{key}")] = values
  end
  puts("temp: #{temp}")
end

файл cmodule.rb:

module Constants

 Cons =
 {
     :toService => "Microcontrol",
     :bodyData=>{}
 }

end

И файл env.rb:

require_relative 'cmodule'
World(Constants)

Итак, чем я запускаю файл test.feature, мой вывод выглядит так:

temp: {:toService=>"Microcontrol", :bodyData=>{:user_id=>"king", :hash=>"xfgh"}}

temp: {:toService=>"Microcontrol", :bodyData=>{:user_id=>"king", :hash=>"xfgh", :shop_id=>"554"}}

Итак, вопрос в том, почемумой второй набросок сценария дает вывод примерно так:

temp: {:toService=>"Microcontrol", :bodyData=>{:user_id=>"king", :hash=>"xfgh", :shop_id=>"554"}}

А не так (это то, что я ожидал от сценария вначале):

temp: {:toService=>"Microcontrol", :bodyData=>{:shop_id=>"554"}}

Но есть еще кое-что,Я начал эксперимент и изменил свой cmodule.rb на:

module Constants
 def self.cons
   {
       :toService => "Microcontrol",
       :bodyData=>{}
   }
 end

end

Также изменил steps.rb:

Given(/^Set data$/) do |table|
  # table is a table.hashes.keys # => [:smth]
  temp = Constants.cons.dup
  table.hashes[0].each do |key, values|
    temp[:bodyData][eval(":#{key}")] = values
  end
  puts("temp: #{temp}")
end

После запуска test.feature у меня есть:

temp: {:toService=>"Microcontrol", :bodyData=>{:user_id=>"king", :hash=>"xfgh"}}

temp: {:toService=>"Microcontrol", :bodyData=>{:shop_id=>"554"}}

Итак, я не могу понять, почему он работает с def и не работает с константами?

1 Ответ

0 голосов
/ 29 мая 2018

Если вы отлаживаете свои определения шагов и проверяете себя, вы можете найти ответ.Ниже приводится предположение:

Когда вы добавляете модуль в World, это означает, что содержимое этого модуля доступно для каждого определения шага, потому что внутри определения шага self - это World.Когда вы определяете Cons как константу, вы устанавливаете значение, которое не может быть изменено.Он живет для жизни вмещающего объекта.Таким образом, Cons будет одинаковым хешем в каждом определении шага (посмотрите на идентификаторы объектов, чтобы подтвердить это).Когда вы используете def, вы вызываете метод, поэтому вы будете получать разные хэши в каждом определении шага.

...