我正在尝试编写一个请求测试,断言应用程序布局上显示正确的链接,具体取决于用户是登录还是退出.FWIW,我正在使用Devise进行身份验证.
这是我的规格:
require 'spec_helper'
require 'devise/test_helpers'
describe "Layout Links" do
context "the home page" do
context "session controls" do
context "for an authenticated user" do
before do
# I know these should all operate in isolation, but I
# want to make sure the user is explicitly logged out
visit destroy_user_session_path
@user = Factory(:user, :password => "Asd123", :password_confirmation => "Asd123")
@user.confirm!
# I tried adding this per the Devise wiki, but no change
@request.env["devise.mapping"] = Devise.mappings[:user]
# Now log a …Run Code Online (Sandbox Code Playgroud) 我正在关注Michal Hartls Rails教程第7章.我已经安装了Factory girl gem.我运行测试时遇到这个错误
Failures:
1) UsersController GET 'show' should be successful
Failure/Error: @user = FactoryGirl.create(:user)
ArgumentError:
Factory not registered: user
# ./spec/controllers/users_controller_spec.rb:10:in `block (3 levels) in <top (required)>'
Finished in 0.66336 seconds 42 examples, 1 failure
Failed examples:
rspec ./spec/controllers/users_controller_spec.rb:14 # UsersController GET 'show' should be successful
Run Code Online (Sandbox Code Playgroud)
的Gemfile
group :test do
gem 'autotest', '4.4.6'
gem "autotest-growl", "~> 0.2.16"
gem "autotest-rails", "~> 4.1.2"
gem "rspec", "~> 2.9.0"
gem 'rspec-rails', '2.9.0'
gem 'webrat', '0.7.3'
gem "spork", '0.9.0'
gem 'annotate', '~> …Run Code Online (Sandbox Code Playgroud) 我有以下型号:
class Ad < ActiveRecord::Base
belongs_to :page
has_one :image
has_one :logo
end
class Page < ActiveRecord::Base
has_many :logos
has_many :images
has_many :ads
end
class Image < ActiveRecord::Base
belongs_to :page
has_many :ads
end
Run Code Online (Sandbox Code Playgroud)
我已经定义了以下工厂:
factory :page do
url 'test.com'
end
factory :image do
width 200
height 200
page
end
factory :ad do
background 'rgb(255,0,0)'
page
image
end
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时:
ad = FactoryGirl.create(:ad)我ActiveModel::MissingAttributeError: can't write unknown attribute ad_id'在广告工厂中决定图像关联的行中出现以下错误.
我在这做错了什么?
我正在使用脚手架来生成rspec控制器测试.默认情况下,它会将测试创建为:
let(:valid_attributes) {
skip("Add a hash of attributes valid for your model")
}
describe "PUT update" do
describe "with valid params" do
let(:new_attributes) {
skip("Add a hash of attributes valid for your model")
}
it "updates the requested doctor" do
company = Company.create! valid_attributes
put :update, {:id => company.to_param, :company => new_attributes}, valid_session
company.reload
skip("Add assertions for updated state")
end
Run Code Online (Sandbox Code Playgroud)
使用FactoryGirl,我已经填写了:
let(:valid_attributes) { FactoryGirl.build(:company).attributes.symbolize_keys }
describe "PUT update" do
describe "with valid params" do
let(:new_attributes) { FactoryGirl.build(:company, name: 'New Name').attributes.symbolize_keys …Run Code Online (Sandbox Code Playgroud) 只要我有一个项目工厂
Factory.define :project do |p|
p.sequence(:title) { |n| "project #{n} title" }
p.sequence(:subtitle) { |n| "project #{n} subtitle" }
p.sequence(:image) { |n| "../images/content/projects/#{n}.jpg" }
p.sequence(:date) { |n| n.weeks.ago.to_date }
end
Run Code Online (Sandbox Code Playgroud)
而且我正在创建项目实例
Factory.build :project
Factory.build :project
Run Code Online (Sandbox Code Playgroud)
到这时,下次我执行Factory.build(:project)时,我将收到一个Project的实例,其标题设置为"project 3 title",依此类推.不奇怪.
现在说我想在这个范围内重置我的计数器.就像是:
Factory.build :project #=> Project 3
Factory.reset :project #=> project factory counter gets reseted
Factory.build :project #=> A new instance of project 1
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最佳方法是什么?
我目前正在使用以下版本:
factory_girl(1.3.1)factory_girl_rails(1.0)
在此先感谢,最好的问候.
我遇到了以下问题:在我的应用程序中,我使用继承来定义我的用户模型:
class User
include Mongoid::Document
field :name...
field :bla...
end
class CustomUser < User
field :customuserfield...
end
Run Code Online (Sandbox Code Playgroud)
我如何编写工厂来映射我的规格中的这个类hirachie.并继续写作,不要重复自己.
FactoryGirl.define do
factory :user do
name "name"
bla "bla"
factory :custom_user do
customfield "customfield"
end
end
end
Run Code Online (Sandbox Code Playgroud)
这对我不起作用,因为该课程也是"用户".使用"用户"我收到了无效错误,因为自定义字段在这里并不存在.是否有良好的做法,方法或方法来重新安排这样的事情.
我正在尝试使用FactoryGirl/ 来模拟会话shoulda(它使用了固定装置,但我在使用工厂时遇到了问题).我有以下工厂(用户登录和电子邮件都有unique验证):
Factory.define :user do |u|
u.login 'quentin'
u.email 'quentin@example.com'
end
Factory.define :session_user, :class => Session do |ses|
ses.association :user, :factory => :user
ses.session_id 'session_user'
end
Run Code Online (Sandbox Code Playgroud)
这是测试
class MessagesControllerTest < ActionController::TestCase
context "normal user" do
setup do
@request.session[:user_id]=Factory(:user).id
@request.session[:session_id]=Factory(:session_user).session_id
end
should "be able to access new message creation" do
get :new
assert_response :success
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时rake test:functionals,我得到了这个测试结果
1) Error:
test: normal user should be able to access new message creation. (MessagesControllerTest): …Run Code Online (Sandbox Code Playgroud) 如何创建同一类的多个记录或多个工厂?
我试过了:
Factory.define :user do |user|
user.email "someuser@somesite.com"
user.password "somepassword"
user.email "another_existing_user@somesite.com"
user.password "somepassword"
end
Run Code Online (Sandbox Code Playgroud)
和
Factory.define :user do |user|
user.email "someuser@somesite.com"
user.password "somepassword"
end
Factory.define :user do |user|
user.email "another_existing_user@somesite.com"
user.password "somepassword"
end
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - Attribute already defined: email.
这可能很简单,但我无法在任何地方找到一个例子.
我有两个工厂:
FactoryGirl.define do
factory :profile do
user
title "director"
bio "I am very good at things"
linked_in "http://my.linkedin.profile.com"
website "www.mysite.com"
city "London"
end
end
FactoryGirl.define do
factory :user do |u|
u.first_name {Faker::Name.first_name}
u.last_name {Faker::Name.last_name}
company 'National Stock Exchange'
u.email {Faker::Internet.email}
end
end
Run Code Online (Sandbox Code Playgroud)
我想要做的是在创建配置文件时覆盖一些用户属性:
p = FactoryGirl.create(:profile, user: {email: "test@test.com"})
Run Code Online (Sandbox Code Playgroud)
或类似的东西,但我不能正确的语法.错误:
ActiveRecord::AssociationTypeMismatch: User(#70239688060520) expected, got Hash(#70239631338900)
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过首先创建用户然后将其与配置文件相关联来实现此目的,但我认为必须有更好的方法.
或者这将工作:
p = FactoryGirl.create(:profile, user: FactoryGirl.create(:user, email: "test@test.com"))
Run Code Online (Sandbox Code Playgroud)
但这似乎过于复杂.是否有更简单的方法来覆盖关联的属性?这是什么语法?
我想让工厂女孩在我的rails 4.1.1 app中使用rspec运行.
问题是当我rspec在命令行中运行时,我得到了Failure/Error: verse = build(:verse) ArgumentError: Factory not registered: verse.
我很遗憾,因为我检查了工厂女孩入门页面,这里的许多答案在SO和我仍然无法解决这个问题.
在我的Gemfile中:
gem 'rails', '4.1.1'
group :development, :test do
gem 'rspec-rails'
gem "factory_girl_rails"
end
Run Code Online (Sandbox Code Playgroud)
我的spec_helper.rb文件:
require 'factory_girl_rails'
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
end
Run Code Online (Sandbox Code Playgroud)
规格/控制器/ API/verses_controller_spec.rb
describe "API Controller" do
describe "show a verse" do
it "should return status 200" do
verse = build(:verse)
get :show, id: verse.id
expect(response).to have_http_status(200)
end
it "should return json object" do
verse = build(:verse)
get :show, id: verse.id
JSON.parse(response.body).should …Run Code Online (Sandbox Code Playgroud) factory-bot ×10
rspec ×3
ruby ×3
associations ×1
devise ×1
rspec-rails ×1
rspec2 ×1
scaffolding ×1
shoulda ×1