2013-06-20 53 views
0

一个小问题,我是相当新的红宝石,我有一个包含其他类(组成)红宝石/青瓜成分设计

我试图内黄瓜访问类实例的实例类,但保留返回“的零:NilClass(NoMethodError) ‘一个错误 未定义的方法`BK BK’的方法位于内部类 我猜这个错误是因为黄瓜不能访问内部类里面。 什么是设计这个或一个合适的解决方案的最佳方式?

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 

回答

1

问题简化

的问题可以被简化为可见无黄瓜(即,问题是一般红宝石编码问题):

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"