2011-08-21 9 views
6

Mam spec/controllers/add_to_carts_spec.rb:niezdefiniowana metoda `sign_in' dla # <RSpec :: Rdzeń :: ExampleGroup :: Nested_1 :: Nested_1: 0x1057fd428> Błąd podczas próby utworzenia rspec ze opracować

require 'spec_helper' 

describe CartItemsController do 

    before (:each) do 
    @user = Factory(:user) 
    sign_in @user 
    end 

    describe "add stuff to the cart" do 
    it "should add a product to the cart" do 
     product = FactoryGirl.create(:product) 
     visit products_path(product) 
     save_and_open_page 
     click_on('cart_item_submit') 
    end 
    end 

end 

i /spec/support/spec_helper.rb:

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'capybara/rspec' 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

RSpec.configure do |config| 
    config.mock_with :rspec 
    config.use_transactional_fixtures = true 
end 

... który również ładuje /spec/support/devise.rb:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

Guard jest działa w tle i ciągle rzuca to:

Failures: 

    1) CartItemsController add stuff to the cart should add a product to the cart 
    Failure/Error: sign_in @user 
    NoMethodError: 
     undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x1057fd428> 
    # ./spec/controllers/add_to_carts_spec.rb:7 

Spędziłem ostatnie kilka godzin próbując różnych ustawień konfiguracyjnych i różne składnie, ale nic nie wydaje się zmieniać. Jakieś pomysły?

(edytowane w celu odzwierciedlenia nowszą błąd)

Odpowiedz

12

te pomocników testowe nie będą działać dla integracji/żądanie specyfikacji. Zalecanym sposobem przetestowania Devise w tych sytuacjach jest odwiedzenie strony logowania, wypełnienie formularza i przesłanie go, a następnie uruchomienie testu.

Proszę zobaczyć David Chelimsky's answer do poprzedniego pytania SO na ten temat, aby uzyskać bardziej kompletne wyjaśnienie.

+1

To specyfikacja kontrolera, więc oczekiwałbym, że zadziała. – solnic

+1

Dzięki, masz rację. Mylę dwa rodzaje specyfikacji. Używałem kapibary, aby odwiedzać strony i tym samym używać mechanizmów sesji, ale próbuję zalogować użytkownika tak, jak robię to w mojej specyfikacji kontrolera. kapibara nie używa do nich ani nie ma do nich dostępu. –

14

Z jakiegoś powodu to również nie działa na mnie tak po prostu ręcznie włączyć ten pomocnik w moich specyfikacji takiego:

describe CartItemsController do 
    include Devise::TestHelpers 

    # ... 
end 
+0

Naprawdę przydatny, dzięki – Starkers

17

Idealnym rozwiązaniem byłoby, aby utworzyć plik w specyfikacji/support/opracowania .rb i obejmują pomocników testowych Devise w config rspec poprzez następujący kod:

Rspec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

parametr typ obejmuje pomocników tylko w twoich specyfikacji kontrolera, to aby uniknąć przyszłych problemów, które mogą wyniknąć z jego wezwaniem, gdy testowanie modele lub widoki. To opcjonalne.

Powodem, dla którego zdecydowaliśmy się dodać dyskretny plik do włączenia pomocników, w przeciwieństwie do umieszczania ich w specyfikacjach, jak to zrobiliśmy powyżej, jest to, że w przypadku, gdy specyfikacje zostaną zregenerowane, specyfikacja zostanie nadpisana.

+0

Ta odpowiedź nie ma upvotes (inne niż moje własne) i działa bardzo dobrze. Nie zapomnij o tym, jako możliwym rozwiązaniu. – Ecnalyr

+0

Chociaż jest to właściwy sposób na włączenie tych pomocników, oryginalny plakat już używa tej metody bez powodzenia. To właściwa odpowiedź na inne pytanie. – zznq

+0

Sekcja dotycząca parametru ': type' jest tam, gdzie to pytanie uratowało mi trochę bólu głowy. To nie jest bardzo jasno udokumentowane w dokumentacji Devise na temat testowania. – Matt

Powiązane problemy