2011-12-05 17 views
5

Mam następujący kod:TypeError: niewłaściwy typ argumentu String (oczekiwane Module)

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 

które zasadniczo zawiera ładunek danych odnośników, podzielone na kategorie. Celem jest stworzenie metody dla każdej kategorii w bazie danych. Za pomocą konsoli Rails ten kod działa zgodnie z oczekiwaniami:

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

Jednak moje dane techniczne zawodzą. Poniższa specyfikacja:

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 

nie powiedzie się z:

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

jaki jest problem?

+0

pokaż nam linię-włącz. gdziekolwiek to jest. –

Odpowiedz

0

Istnieje kilka powodów, dlaczego to nie działa:

  • niejawne badani nie wydają się pracować z metod statycznych
  • Trzeba kontekst lub it blok wokół przykładów:

Ten kod działa:

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 
0

include Metoda jest zwykle używana do włączenia modułu do klasy (lub innego modułu). Wygląda na to, że nie zastąpiły one include w zakresie describe, tylko w zasięgu it.

3

Po pierwsze, twoja składnia its jest niewłaściwy, należy use the block form:

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

Po drugie, kiedy describe klasa, przedmiot jesteś dopasowanie jest instancja tej klasy:

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

If the first argument to the outermost example group is a class, an instance of that class is exposed to each example via the subject() method.

Możesz być jawne o temacie i wszystko będzie działać:

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

+1. Istnieje nawet opisywany pomocnik klasy. Tak więc temat może być czymś podobnym do tematu {describe_class}. – lucapette

+0

FYI - Próbowałem tego i nie zadziałało. –

Powiązane problemy