【问题标题】:Ruby/Cucumber Composition design红宝石/黄瓜组合设计
【发布时间】:2013-06-17 06:02:18
【问题描述】:

一个小问题我对 Ruby 还很陌生,我有一个包含其他类(组合)实例的类

我正在尝试访问 Cucumber 中的类实例,但一直返回错误 nil:NilClass (NoMethodError) 的未定义方法 `bk' 'bk' 方法位于 interior 类 我猜这个错误是因为 Cucumber 无法访问 Interior 类。 设计这个或合适的解决方案的最佳方式是什么?

class CarConfig


def initialize(browser, wait)
@browser = browser
@wait = wait
@equipments = Equipment.new(@browser)
@interior = Interior.new(@browser)
@engines = Engines.new(@browser)
@exterior = Exterior.new(@browser)
@grades = Grades.new(@browser)
end

def click_comfort
@browser.find_element(:css, 'a.xdata-id-Comfort').click
end


def check_equipment
  equipment_availability = []
  equipment_not_available = " equipment not available"
  equipment_currently_available = "equipment available"

 equipment = [@equipments.lifestyle,@equipments.elegance, @equipments.comfort,   @equipments.executive, @equipments.luxury,
             @equipments.innova].each do

end
  equipment_availability.push equipment

 if "#{equipment_availability}".include? "disabled"
   equipment_not_available
 else
   equipment_currently_available
 end

结束

 Cucumber 

 Given /^I have selected Comfort$/ do
 @car_configurator = CarConfig.new(@browser, @wait)
 @browser.get $car_config_page
 sleep(2)
 @car_configurator.click_comfort
 sleep(3)

 end

 Then /^I should see interior BK as available$/ do
 @interior.bk.should_not include ("disabled"), ("selected")
 end

【问题讨论】:

    标签: ruby automation webdriver cucumber bdd


    【解决方案1】:

    问题简化

    问题可以简化为不用 Cucumber 就可以看到(即问题是一般的 ruby​​ 编码问题):

    class Interior
        def bk()
            return 'bk method'
        end
    end 
    
    class CarConfig
        def initialize(browser, wait)
            @browser = browser
            @wait = wait
            @interior = Interior.new
        end
    end
    
    @car_configurator = CarConfig.new('browser', 'wait')
    @interior.bk
    #=> stuff.rb:16:in `<main>': undefined method `bk' for nil:NilClass (NoMethodError)
    

    问题是@interior 不存在于主要的范围内(或者在你的情况下是黄瓜步骤)。它仅在 CarConfig 的实例中定义 - 即 @car_configurator

    解决方案

    如果您想访问@interior,您需要在 CarConfig 中为此创建一个方法。使用attribute accessor 很容易做到这一点。 CarConfig 类将添加以下行:

    attr_accessor :interior
    

    这样类就变成了:

    class CarConfig
        attr_accessor :interior
    
        def initialize(browser, wait)
            @browser = browser
            @wait = wait
            @interior = Interior.new
        end
    end
    

    要调用@interior 对象的bk 方法,您需要从@car_configurator 开始访问它:

    @car_configurator.interior.bk
    #=> "bk method"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多