rspec Ruby方法插入Hash

时间:2013-02-13 00:29:16

标签: ruby rspec

我无法搞清楚这个挑战。这就是我所拥有的:

class Dictionary
attr_accessor :entries

def initialize
    @x = Hash.new
end

def entries
    @x
end

def add(hash)
    @x.merge!(hash)
end

end

@d=Dictionary.new
@d.add('fish' => 'aquatic animal')
puts @d.entries

我正在=>> “fishaquatic动物”

我想要得到=> {'fish'=> '水生动物'}

3 个答案:

答案 0 :(得分:2)

对于某些Ruby版本,to_s上的

Hash的行为不太理想。试试puts @d.entries.inspect

<强>更新

以下代码适用于我(Ruby 1.9.3和rspec 2.12.0):

class Dictionary      
  def initialize
    @x = Hash.new
  end

  def entries
    @x
  end

  def add(hash)
    @x.merge!(hash)
  end
end

describe Dictionary do
  before do
    @d = Dictionary.new
  end

  it 'can add whole entries with keyword and definition' do
    @d.add('fish' => 'aquatic animal')
    @d.entries.should == {'fish' => 'aquatic animal'}
  end
end

答案 1 :(得分:0)

如上所述,您的代码当前正在将@x设置为新的空Hash,然后在每次调用entries方法时将其返回。

尝试将该设置代码移动到初始化方法中:

class Dictionary
    attr_reader :entries

    def initialize
        @entries = Hash.new
    end

    def add(hash)
        @entries.merge!(hash) 
    end
end

答案 2 :(得分:0)

对我来说,rspec代码有点奇怪。第二个测试执行entry方法,entries方法将实例变量@x重置为空白。因此,最好将实例变量添加为attr_reader,然后在创建新的字典对象时将其初始化。所以它看起来像这样

class Dictionary
    attr_reader @x

    def initialize
      @x = Hash.new
    end

    def add(hash)
      @x.merge!(hash) 
    end
end

并且测试将是这样的

@d.add(fish: "aquatic animal")
@d.x.should == {'fish' => "aquatic animal"}