Расширение модулей и тестирование методов класса (или экземпляра?) В Ruby - PullRequest
0 голосов
/ 29 апреля 2018

Новичок в Ruby и заранее спасибо! У меня есть 2 файла в одном каталоге. Где.рб =

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

и 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

во всех моих тестах написано NoMethodError: неопределенный метод `where 'для # Array: 0x000000027d6a20.

Я не уверен, что означает ошибка. Я создал модуль с методом класса, который должен быть применим. Метод модуля должен быть доступен для класса WhereTest с extend Where

1 Ответ

0 голосов
/ 29 апреля 2018

Сообщение об ошибке означает, что вы пытаетесь вызвать метод where в экземпляре Array, когда такой метод не определен для массивов.

Похоже, что вы хотите добавить метод where в класс Array (поскольку вы вызываете @fixtures.where, а @fixtures - это массив. Однако вместо этого вы добавляете его в класс WhereTest.

Вам нужно будет сделать что-то вроде:

class Array
  extend Where
end

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

Теперь есть и другие проблемы с кодом, который вы представляете (например, исправление базового класса опасно и, как правило, настоятельно не рекомендуется). Но это должно хотя бы немного приблизить вас к тому, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...