Question

EDIT Read my comment to this question

I'm very new to rails, so please bear with me. I've been trying to configure a test for Devise using factory girl and rspec. This has taken me the best part of 2 hours, and scouring half the internet to no avail. Even though there is loads of thread on what seems to be my issue, I just cant figure it out.

This is how my /spec files looks like.

GET Home Gives the correct status code
     Failure/Error: sign_in user
     NoMethodError:
       undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_2:0x00000106f32558>
     # ./spec/models/user_spec.rb:6:in `block (2 levels) in <top (required)>

This is the error message I get, trying to achieve the following test:

user_spec.rb:

require 'spec_helper'

describe "GET Home" do
  before do

##I have tried all sorts of things here. I have also tried to define a module in devise.rb (see note below*), and then call that module here instead of the 2 lines below. But I get the same error, no local variable or undefined method for ...

    user = FactoryGirl.create(:user)
    sign_in user
  end

  describe "GET /Home"
  it "Gives the correct status code" do
    get root_path
    response.status.should be(200)
  end


end

in spec/factories/users.rb:

FactoryGirl.define do 
    factory :user do 
        name "Christoffer"
        email "test@test2.com" 
        password "testtest" 
        password_confirmation "testtest" 
    end 
end

And the folling lines is included in spec_helpers.rb

config.include FactoryGirl::Syntax::Methods
config.include Devise::TestHelpers, :type => :controller

Now, by doing this, i get the error above. Can anyone possibly explain what I'm doing wrong here? It might be something really obvious, as I'm not really that well rehearsed in the ways of Rails.


*Note (module I tried to define in devise.rb and insert in the before do):

module ValidUserRequestHelper
    # Define a method which signs in as a valid user.
    def sign_in_as_a_valid_user_nommels
        # ASk factory girl to generate a valid user for us.
        @user ||= FactoryGirl.create :user

        # We action the login request using the parameters before we begin.
        # The login requests will match these to the user we just created in the factory, and authenticate us.
        post_via_redirect user_session_path, 'user[email]' => @user.email, 'user[password]' => @user.password
    end
end
Was it helpful?

Solution

The purpose of 'spec/requests' is for integration tests. You would test features of your app from the user's perspective (ie. fill in certain info, then click button, then so and so should happen if certain inputs are valid or invalid). Spec/models and spec/controllers are usually for unit tests where you test for smaller parts of your app (ie. what happens if the password and password_confirmation params passed to your user model don't match)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top