Как вызывать аргументы функции один за другим - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть файл Ruby для генерации отчета о результатах теста. Так как я определил так много переменных, как имя Тестового случая, номер версии, затем результат module1, затем результат модуля 2 и конечный результат.

Теперь я делаю это как функцию с аргументами в качестве всех переменных. Другой файл Ruby должен вызывать аргументы один за другим. Значит в начале Testcase.rb я буду писать testcase name = Test1; тогда номер версии as0.1. Затем, когда будет работать module1, я обновлю результат как пройденный или неудачный, аналогично для module2. Но я не знаю, как вызывать аргументы по одному.

Это переменные в моем отчете. Rb = tc_name, version, tester, login_result, checkout_result, signout_result.

В моем тестовом примере я должен передать значение одно за другим. Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Эта идея называется ' curry '.
Поиск в Google для 'ruby curry' даст вам много хитов.
Проверьте этот SO-ответ для некоторых примеров.

1 голос
/ 23 ноября 2011

Если у вас есть Ruby 1.9, возможно, это соответствует вашим потребностям:

report = ->(tc_name, version, tester, login_result, checkout_result) do
  puts <<-ENDOUTPUT
       Test Case: #{tc_name}
         Version: #{version}
          Tester: #{tester}
       Login Res: #{login_result}
    Checkout Res: #{checkout_result}
  ENDOUTPUT
end

test1 = report.curry["Test1"]
v12   = test1["v1.2"]
me12  = v12["Phrogz"]
me12["Success"]["Failed"]
#=>    Test Case: Test1
#=>      Version: v1.2
#=>       Tester: Phrogz
#=>    Login Res: Success
#=> Checkout Res: Failed

v13   = test1["v1.3"]
me13  = v13["Phrogz"]
me13["Success"]["Success"]
#=>    Test Case: Test1
#=>      Version: v1.3
#=>       Tester: Phrogz
#=>    Login Res: Success
#=> Checkout Res: Success

В качестве альтернативы (и, возможно, менее запутанно) вы могли бы вместо этого отслеживать хэш ключей.Как только вы накопите все нужные вам ключи, вы можете что-то с ними сделать;в противном случае вы просто объединяете любые новые данные в хеш и передаете их обратно.Это обеспечивает те же преимущества частичного применения, что и выше, а также позволяет накапливать переменные в любом порядке:

def report(data={},more={})
  data = data.merge(more)
  if data.key?(:tc_name) && data.key?(:version) && data.key?(:tester) &&
     data.key?(:login_result) && data.key?(:checkout_result)
    puts <<-ENDOUTPUT
         Test Case: #{data[:tc_name]}
           Version: #{data[:version]}
            Tester: #{data[:tester]}
         Login Res: #{data[:login_result]}
      Checkout Res: #{data[:checkout_result]}
    ENDOUTPUT
  else
    data # send the newly-merged data back to the user
  end
end

test1 = report tc_name:"Test1"
me    = report test1, tester:"Phrogz"
v12   = report me, version:"v1.2"
report v12, login_result:"Success", checkout_result:"Failed"
#=>    Test Case: Test1
#=>      Version: v1.2
#=>       Tester: Phrogz
#=>    Login Res: Success
#=> Checkout Res: Failed

v13 = report me, version:"v1.3"
report v13, login_result:"Success", checkout_result:"Success"
#=>    Test Case: Test1
#=>      Version: v1.3
#=>       Tester: Phrogz
#=>    Login Res: Success
#=> Checkout Res: Success

Однако функции не нужно объединять значения и накапливать данные.Вы можете сделать это самостоятельно в простых хешах:

BAD_LOGIN   = { login_result:"FAILED" }
ALL_GOOD    = { login_result:"OK", checkout_result:"OK" }
ME          = { tester:"Phrogz" }

def report(data)
  puts <<-ENDOUTPUT
       Test Case: #{data[:tc_name]}
          Tester: #{data[:tester]}
       Login Res: #{data[:login_result]}
    Checkout Res: #{data[:checkout_result]}
  ENDOUTPUT
end

report ME.merge(tc_name:"Test1").merge(BAD_LOGIN)
#=>    Test Case: Test1
#=>       Tester: Phrogz
#=>    Login Res: FAILED
#=> Checkout Res: 

ok = {tc_name:"Test2"}.merge(ME).merge(ALL_GOOD)
report ok
#=>    Test Case: Test2
#=>       Tester: Phrogz
#=>    Login Res: OK
#=> Checkout Res: OK

report ok.merge( checkout_result:"CAUGHT FIRE(!)" )
#=>    Test Case: Test2
#=>       Tester: Phrogz
#=>    Login Res: OK
#=> Checkout Res: CAUGHT FIRE(!)
...