2011-12-08 8 views
5

Używając szyn i rspec, łatwo jest wygenerować potrzebne pliki dla rspec, gdy używam polecenia rails generate z modelami/widokami/kontrolerami. Ale teraz chcę napisać specyfikacje dla modułu, który napisałem. Moduł jest w /lib/my_module.rb więc stworzyłem spec w /spec/lib/my_module_spec.rbjak pisać/uruchamiać specyfikacje dla plików innych niż model/widok/kontroler

Problem mam jest to, że gdy próbuję zrobić rspec spec/ plik my_module_spec.rb jest uruchamiany, ale odniesienie do mojego modułu w lib/my_module.rb nie można znaleźć. Jak to zrobić?

Wystarczy FYI plik my_module_spec.rb ma require 'spec_helper' w nim już

require 'spec_helper' 

describe "my_module" do 
    it "first test" 
    result = MyModule.some_method # fails here because it can't find MyModule 
    end 
end 
+0

Czy dodajesz moduł do swojego pliku my_module_spec.rb? Czy możesz podać źródło? – Jasper

+0

@Jasper Nie. Ale nie muszę tego robić, gdy robię to z modelami/widokami/kontrolerami. – Brand

+1

Czy potrzebujesz pliku źródłowego modułu w powiązanej specyfikacji? 'require" # {Rails.root} /lib/my_module.rb "' Miałem podobny problem do tego, co widzisz, a to w połączeniu z poniższym rozwiązaniem Jaspera dostarczyło mnie tam, gdzie musiałem być. – jaydel

Odpowiedz

9

można spróbować w tym moduł i może owijając go w obiekcie

require 'spec_helper' 

#EDIT according to 
# http://stackoverflow.com/users/483040/jaydel 
require "#{Rails.root}/lib/my_module.rb" 

describe MyModule do 

    let(:wrapper){ 
    class MyModuleWrapper 
     include MyModule 
    end 
    MyModuleWrapper.new 
    } 

    it "#some_method" do 
    wrapper.some_method.should == "something" 
    end 

end 
0

umieścić następujące informacje w pliku config/application.rb:

config.autoload_paths += %W(#{Rails.root}/lib) 

Byłem po prostu z tym samym problemem, a powyższe sprawdziło się dla mnie. Nie ma żadnego powodu, dla którego powinieneś przeskakiwać przez obręcze, aby móc uzyskać dostęp do plików lib/ z RSpec i napisać dla nich testy.

1

Czy Twój moduł zawiera metody klas lub metody instancji? Pamiętaj, że tylko metody klasy będą dostępne za pośrednictwem

MyModule.some_method 

co oznacza, że ​​some_method jest zdefiniowany jako

def self.some_method 
    ... 
end 

Jeśli moduł zawiera metody instancji, a następnie użyć rozwiązanie Jaspera powyżej. Nadzieja, która wyjaśnia.

Powiązane problemy