红宝石中的“哪里”行为是什么?

时间:2015-05-09 05:10:17

标签: arrays ruby methods hash

我正在尝试编写一个模块来传递我的所有测试。它看起来像是一系列哈希。我想弄清楚'where'逻辑是什么?所以我可以尝试编写一个模块来传递所有的测试。

试验:

require 'test/unit'

class WhereTest < Test::Unit::TestCase
def setup
 @boris   = {:name => 'Boris The Blade', :quote => "Heavy is good. Heavy is reliable. If it doesn't work you can always hit them.", :title => 'Snatch', :rank => 4}
 @charles = {:name => 'Charles De Mar', :quote => 'Go that way, really fast. If something gets in your way, turn.', :title => 'Better Off Dead', :rank => 3}
 @wolf    = {:name => 'The Wolf', :quote => 'I think fast, I talk fast and I need you guys to act fast if you wanna get out of this', :title => 'Pulp Fiction', :rank => 4}
 @glen    = {:name => 'Glengarry Glen Ross', :quote => "Put. That coffee. Down. Coffee is for closers only.",  :title => "Blake", :rank => 5}

 @fixtures = [@boris, @charles, @wolf, @glen]
end

def test_where_with_exact_match
  assert_equal [@wolf], @fixtures.where(:name => 'The Wolf')
end

def test_where_with_partial_match
  assert_equal [@charles, @glen], @fixtures.where(:title => /^B.*/)
end

def test_where_with_mutliple_exact_results
  assert_equal [@boris, @wolf], @fixtures.where(:rank => 4)
end

def test_with_with_multiple_criteria
  assert_equal [@wolf], @fixtures.where(:rank => 4, :quote => /get/)
end

def test_with_chain_calls
  assert_equal [@charles], @fixtures.where(:quote => /if/i).where(:rank => 3)
end

end

1 个答案:

答案 0 :(得分:0)

仔细查看第一次测试:

@fixtures.where(:name => 'The Wolf')

@fixtures对象属于Array类,您正在调用其名称为where的方法。因此,要使此测试通过,您必须在Array或其父类之一上定义名为where的方法。作为第一次尝试,你可以这样写:

class Array
  def where(options)
  end
end

我认为这就是你所要求的。在编写上面的代码之后,您应该从测试中获得不同的错误消息。在where方法中编写代码是为了让所有测试都通过,这是你的工作。