Тестовый пользователь заходит в свой профиль с помощью rspec capybara, Warden gems on rails

Я новичок в Ruby on rails и программировании в целом. В задании, которое я выполняю, меня попросили создать тест, в котором пользователь посещает свой профиль. Установлены гемы Rspec, Devise и капибара.

Вот мой profiles_spec:

require 'rails_helper'

describe "Visiting profiles" do 

  include TestFactories
  before do 
    @user = authenticated_user
    @post = associated_post(user: @user)
    @comment = Comment.new(user: @user, post: @post, body:"A comment")
    allow(@comment).to receive(:send_favorite_emails)
    @comment.save
    user = FactoryGirl.create(:user)
    login_as(user, :scope => :user)

  end

  describe "not signed in" do

    it "shows profile" do 
      visit user_path(@user)
      expect(current_path).to eq(user_path(@user))

      expect(page).to have_content(@user.name)
      expect(page).to have_content(@post.title)
      expect(page).to have_content(@comment.body)
    end

  end

  describe "user visting own profile" do 

  it "shows profile" do 
    visit user_path(current_user)

    expect(current_path).to eq(user_path(user))
    expect(page).to have_content(user.name)
    expect(page).to have_content(@post.title)
    expect(page).to have_content(@comment.body)
    end
  end
end

Вот мои TestFactory:

module TestFactories 
  include Warden::Test::Helpers
  Warden.test_mode!
    def associated_post(options = {})
   post_options = {
     title: 'Post title',
     body: 'Post bodies must be pretty long.',
     topic: Topic.create(name: 'Topic name',description: 'the description of a topic must be long'),
     user: authenticated_user
   }.merge(options)

   Post.create(post_options)
 end

 def authenticated_user(options = {})
  user_options = { email: "email#{rand}@fake.com", password: 'password'}.merge(options)
  user = User.new( user_options)
  user.skip_confirmation!
  user.save
  user 
 end

 FactoryGirl.define do
  factory :user do
    email '[email protected]'
    password 'f4k3p455w0rd'
    user = FactoryGirl.create(:user)
    login_as(user, :scope => :user)
    # if needed
    # is_active true
  end
end

end 

Вот моя модель пользователя:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  has_many :posts, dependent: :destroy
  has_many :comments, dependent: :destroy
  has_many :votes, dependent: :destroy
  has_many :favorites, dependent: :destroy

  mount_uploader :avatar, AvatarUploader

  def admin?
    role == 'admin'
  end

  def moderator?
    role == 'moderator'
  end

  def favorited(post)
    favorites.where(post: post.id).first
  end

  def voted(post)
    votes.where(post: post.id).first
  end

end

Когда я запускаю тест профилей, я получаю эту ошибку:

`<module:TestFactories>': uninitialized constant TestFactories::FactoryGirl (NameError)

Я не уверен, правильно ли я использую надзирателя.

Спасибо.


person Zein    schedule 12.04.2015    source источник


Ответы (2)


Ошибка в том, что вы не включили FactoryGirl в свой TestFactories-module.

Ваш завод выглядит довольно грязно.

В моих проектах у меня есть структура папок с spec/factories, куда я помещаю фабрики.

Например, я бы назвал это users.rb:

FactoryGirl.define do
  factory :user do
    email
    password '12345678'
  end
end

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

confirmed_at: { Time.zone.now}

В отдельную фабрику под названием shared я поместил:

  sequence(:email) { |n| "name#{n}@domain.se" }

Затем, когда я хочу, чтобы пользователь участвовал в тесте, я использую

let(:user) { FactoryGirl.create(:user

И вы должны быть в состоянии использовать

login_as

Я не уверен, как это работает, потому что я в основном использую CanCanCommunity.

Извиняюсь за сумбурный пост, писал с телефона.

person davidwessman    schedule 12.04.2015

В сообщении об ошибке uninitialized constant...FactoryGirl говорится, что FactoryGirl недоступен.

Варианты: установить и настроить драгоценный камень заводской девушки или избегать его, пока он не понадобится.

Для этой спецификации, похоже, фабричная девушка ничего не добавляет, поэтому рассмотрите возможность удаления этих ссылок на нее (и пока не устанавливайте гем фабричной девушки):

  • Строка user = FactoryGirl.create(:user) от profiles_spec.rb
  • Весь блок FactoryGirl.define do...end в TestFactories

Похоже, что существующий объект @user соответствует требованиям спецификации. user и current_user, похоже, не делают ничего такого, для чего нельзя было бы использовать @user. Извиняюсь, если я что-то пропустил.

person Eliot Sykes    schedule 13.04.2015
comment
Эй, Элиот, спасибо за ответ. Я пытался использовать помощники Devise: sign_in @user Но я получил сообщение об ошибке: ``` Ошибка/ошибка: невозможно найти соответствующую строку из обратной трассировки NoMethodError: неопределенный метод` env' for nil:NilClass ``` В соответствии с инструкциями задания, в нем говорится, что помощники по разработке не работают со спецификациями/функциями. - person Zein; 13.04.2015