RSpec:未定义的方法'max'为4:fixnum

时间:2014-10-29 19:59:49

标签: ruby oop rspec

规范:

# spec/row_spec.rb
require "spec_helper"

module Mastermind
  describe Row do

    context "#initialize" do
      it "has four elements by default" do
        row = Row.new
        expect(row.values.size).to eq 4
      end

      it "can only go up to 6" do
        row = Row.new
        expect(row.values.max).to be <= 6
      end
    end

  end
end

代码:

# lib/mastermind/row.rb
module Mastermind
  class Row
    attr_accessor :values
    def initialize (values=random_row)
      @values = values
    end

    def random_row
      4.times {random||=[] << rand(1..6)}
    end

  end
end

行应该是主脑游戏的一行,有四个随机值在1到6之间,这个测试应该确保它正常运行。看起来值返回int而不是数组。为什么呢?

我如何自行排除故障?我尝试通过附加

来简单地查看值发生了什么
row = Row.new
puts row.values

到我的row.rb,但我得到一个未初始化的常量错误。为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

您的问题是#random_row将返回4Fixnum#times的返回值为self),这意味着当您初始化Row时, @values设置为4

您可能需要以下内容:

def random_row
  Array.new(4) { rand(1..6) }
end

答案 1 :(得分:1)

这是你的问题(random_row):

[1] pry(main)> 4.times {random||=[] << rand(1..6)}
=> 4

times返回值。你想要这样的东西:

[2] pry(main)> 4.times.map { rand(1..6) }
=> [6, 5, 3, 6]

您的其他问题是因为您没有指定模块,Row不存在,Mastermind::Row确实存在。

[4] pry(main)> row = Mastermind::Row.new
=> #<Mastermind::Row:0x00000101c593e0 @values=4>
[5] pry(main)> row.values
=> 4