Пользователь-тестер, посещающий свой профиль с rspec capybara, драгоценными камнями Warden на рельсах

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

Вот мой spec__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

Вот мои тестовые фабрики:

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 'test@example.com'
    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)

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

Спасибо.

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.

Извините за грязный пост, написанный на телефоне.

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

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

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

  • Линия user = FactoryGirl.create(:user) от profiles_spec.rb
  • Целиком FactoryGirl.define do...end блокировать в TestFactories

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

Другие вопросы по тегам