简体   繁体   English

在Ruby中扩展模块和测试类(或实例?)方法

[英]Extending modules and testing class (or instance?) methods in Ruby

New to Ruby and thank you in advance! Ruby的新手,谢谢您! I have 2 files in the same directory. 我在同一目录中有2个文件。 Where.rb = 其中.rb =

module Where
  def self.where(hash = {})
    self.select do |fixture| #iterate over fixtures indexes |fixture| 
      hash.all?  do |key, value| #return true as long as hash exists
        value === fixture[key]
      end
    end
  end
end

and test.rb = 和test.rb =

require 'minitest/autorun'
require './where.rb'

class WhereTest < Minitest::Test
  extend Where
  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

puts WhereTest

all my tests say NoMethodError: undefined method `where' for # Array:0x000000027d6a20. 我所有的测试都说NoMethodError:#Array:0x000000027d6a20的未定义方法“ where”。

I'm not sure what the error means. 我不确定错误的含义。 I created a module with a class method that should be usable. 我使用应使用的类方法创建了一个模块。 The module's method should be available to WhereTest class with extend Where 该模块的方法应可用于extend Where WhereTest类

The error message means that you are trying to call the where method on an instance of Array when there is no such method defined for arrays. 该错误消息表示没有为数组定义此类方法时,您尝试在Array实例上调用where方法。

It seems that you want the where method added to the Array class (because you call @fixtures.where and @fixtures is an Array. However, you are adding it, instead, to the WhereTest class. 似乎您希望将where方法添加到Array类中(因为您将@fixtures.where@fixtures称为Array。但是,您是将其添加到WhereTest类中。

You would need to do something like: 您将需要执行以下操作:

class Array
  extend Where
end

class WhereTest < Minitest::Test
  def setup
  ...

Now, there are other issues with the code you present (patching a core class is dangerous, for example, and generally strongly recommended against). 现在,您提供的代码还有其他问题(例如,修补核心类是危险的,通常强烈建议不要这样做)。 But this should at least get you a bit closer to what you're trying to do. 但这至少应该使您更接近要尝试的操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM