Пользователь-тестер, посещающий свой профиль с 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
не может быть использован для. Извиняюсь, если я что-то пропустил.