Ошибка типа: неверный тип аргумента String (ожидаемый модуль) - PullRequest
6 голосов
/ 05 декабря 2011

У меня есть следующий код:

class ProfileLookup < ActiveRecord::Base
  class << self
    ProfileLookup.select("DISTINCT category").map{|c| c.category}.each do |category|
      define_method("available_#{category.pluralize}".to_sym) do
        ProfileLookup.where(category: category).order(:value).all.collect{|g| g.value}
      end
    end
  end
end

, который в основном содержит множество поисковых данных, разбитых по категориям. Цель состоит в том, чтобы создать метод для каждой категории в базе данных. Через консоль Rails этот код работает должным образом:

ruby-1.9.3@hub :002 > ProfileLookup.available_genders
  ProfileLookup Load (0.6ms)  SELECT "profile_lookups".* FROM "profile_lookups" WHERE "profile_lookups"."category" = 'gender' ORDER BY value
 => ["Female", "Male"] 

Однако мои спецификации не работают. Следующая спецификация:

require "spec_helper"

describe ProfileLookup do

  its(:available_genders).should include("Male")
  its(:available_age_groups).should include("0-17")
  its(:available_interests).should include("Autos & Vehicles")
  its(:available_countries).should include("United States")

end

завершается с:

Exception encountered: #<TypeError: wrong argument type String (expected Module)>
backtrace:
/Users/fred/code/my_app/spec/models/profile_lookup_spec.rb:5:in `include'

в чем здесь проблема?

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

Во-первых, ваш синтаксис для its неправильный, вы должны использовать блочную форму :

its(:available_genders) { should include("Male") }

Во-вторых, когда вы describe класс, предмет, который вы 'повторное сопоставление - это экземпляр этого класса:

https://www.relishapp.com/rspec/rspec-core/docs/subject/implicit-subject:

Если первым аргументом самой внешней группе примеров является класс, то экземпляром этогокласс раскрывается для каждого примера с помощью метода subject ().

Вы можете быть явно о предмете, и все будет работать:

require "spec_helper"

describe ProfileLookup do

  subject { ProfileLookup }

  its(:available_genders) { should include("Male") }
  its(:available_age_groups) { should include("0-17") }
  its(:available_interests) { should include("Autos & Vehicles") }
  its(:available_countries) { should include("United States") }

end
0 голосов
/ 05 декабря 2011

Метод include обычно используется для включения модуля в класс (или другой модуль).Похоже, они не перезаписали include в области действия describe, только в области действия it.

0 голосов
/ 05 декабря 2011

Есть несколько причин, почему это не работает:

  • Неявные субъекты не работают со статическими методами
  • Вам нужен контекст или it блок вокруг ваших примеров:

Этот код работает:

require "spec_helper"

describe ProfileLookup do

  it 'should know what lookups are available' do
    ProfileLookup.available_genders.should include("Male")
    ProfileLookup.available_age_groups.should include("0-17")
    ProfileLookup.available_interests.should include("Autos & Vehicles")
    ProfileLookup.available_countries.should include("United States")
  end

end
...