как разделить переменную rake в коде, который она вызывает?

Что мне нужно, так это отправить целевой аргумент и использовать его в моих тестах RSpec, например:

$ rake unistall_and_run[test_spec.rb]

Рейкфайл:

desc 'uninstall app to run tests'
  task :uninstall_and_run, [:arg] do |t, arg|
    #note this, i will explain later
    start_driver(fullReset: true)

    oi = arg.to_s.split('"')[1]
    file_dir = (project_home + '/spec/' + oi)
    exec "rspec #{file_dir}"
  end

start_driver вызывается в этой строке, но когда я запускаю тесты (exec "rspec ..."), он вызывается снова, и переданные мной аргументы перезаписываются по умолчанию (потому что они находятся в конфигурации RSpec).

Что я хотел бы сделать, так это проверить мой файл RSpec, был ли он уже вызван, и не запускать его снова.

Вот метод start_driver:

def start_driver(options= {}) if options.empty? capabilities = caps else capabilities = caps(options) end $appium = Appium::Driver.new(caps: capabilities) $browser = $appium.start_driver Appium.promote_appium_methods RSpec::Core::ExampleGroup end


person juhlila    schedule 19.07.2016    source источник
comment
Я не понимаю, что аргументы, которые я передал, перезаписываются по умолчанию. start_driver не использует arg. Вы пытаетесь не запускать start_driver, когда он вызывается где-то еще, когда вы запускаете rspec, или вы пытаетесь передать arg чему-то, что вызывается rspec?   -  person Dave Schweisguth    schedule 20.07.2016
comment
я создал этот метод для получения аргументов: def start_driver(options= {}) if options.empty? capabilities = caps else capabilities = caps(options) end $appium = Appium::Driver.new(caps: capabilities) $browser = $appium.start_driver Appium.promote_appium_methods RSpec::Core::ExampleGroup end   -  person juhlila    schedule 20.07.2016


Ответы (1)


Итак, я нашел способ сделать это. Хотя это не красиво. Я сохраняю файл с нужными мне аргументами при запуске rake:

    desc 'uninstall app to run tests'
      task :uninstall_and_run, [:arg] do |t, arg|
        send_custom_caps(fullReset: true)
        oi = arg.to_s.split('"')[1]
        file_dir = (project_home + '/spec/' + oi)
        exec "rspec #{file_dir}"
      end

и метод send_custom_caps:

  def send_custom_caps(*opts)
    file = File.new(custom_caps_file, "w+")
    File.open(file, 'w') do |f|
      f.write(opts)
    end
  end

теперь сам рубиновый код (в данном случае моя конфигурация спецификации) будет проверять, есть ли пользовательские аргументы перед start_driver. Вот мой пользовательский метод start_driver (который я переименовал):

  def start_appium_driver (options= {})
    if options.empty?
      get_caps
      if $custom_args
        capabilities = caps($custom_args)
      else
        capabilities = caps
      end
    else
      capabilities = caps(options)
    end
    $appium = Appium::Driver.new(caps: capabilities)
    $browser = $appium.start_driver
    Appium.promote_appium_methods RSpec::Core::ExampleGroup
  end

и get_caps

  def get_caps
    if File.exist?(custom_caps_file) #$custom_args
      file = File.read(custom_caps_file)
      $custom_args = eval(file)
      File.delete (custom_caps_file)
    end
    $custom_args unless $custom_args.defined?
  end

возможно, это не лучшее решение, но у меня оно работает нормально :)

person juhlila    schedule 22.07.2016