我有Spork测试服务器的问题.
如果我在config/environments/test.rb中设置config.cache_classes = false,那么规范就会开始出现rasie错误.
Failure/Error: task = Factory(:something, :foo => @foo, :bar => @bar)
DataMapper::ImmutableError:
Immutable resource cannot be modified
Run Code Online (Sandbox Code Playgroud)
这是我的spec_helper.rb:
require 'spork'
Spork.prefork do
if ENV['CODE_COVERAGE'] == '1'
require 'simplecov'
SimpleCov.start 'rails'
end
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'webmock/rspec'
require 'factory_girl'
Dir[Rails.root.join("spec/controllers/shared/*.rb")].each { |f| require f }
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.mock_with :mocha
config.include Rails.application.routes.url_helpers
config.include UrlHelper
config.before(:each) do
repository(:default) do
transaction = DataMapper::Transaction.new(repository)
transaction.begin
repository.adapter.push_transaction(transaction)
end
end
config.after(:each) do …Run Code Online (Sandbox Code Playgroud) 我有这些模型,我正在尝试使用factory_girl创建工厂.
class Foo < ActiveRecord::Base
belongs_to :baz
end
class Baz < ActiveRecord::Base
has_many :foos
end
Run Code Online (Sandbox Code Playgroud)
我不知道如何创建工厂而不创建一个工厂无休止地互相呼叫的循环.
Factory.define :foo do |f|
f.after_create do |ff|
ff.baz = Factory(:baz)
end
end
Factory.define :baz do |f|
f.after_create do |ff|
ff.foos = [Factory.create(:foo)]
end
end
Run Code Online (Sandbox Code Playgroud)
我意识到我可以ff.foos = [Factory.create(:foo)]在baz工厂里闲逛,但在我的baz测试中,我被迫使用foo.baz而不是仅仅使用baz.我是否被迫在测试中将baz其从foo工厂中取出来使用该对象?或者,还有更好的方法?
在工厂中,如何引用正在创建的对象中的其他字段之一的值?
假设我的模型Widget有两个字段,nickname和fullname
在我的工厂里面,我想使用Faker在每次创建工厂时创建一个不同的随机昵称.(最后想通了我必须使用sequence(:nickname),否则所有工厂的名称都是一样的.)
为了使一些断言更容易测试,我想生成一个基于昵称的全名,类似于 fullname = "Full name for #{nickname}"
FactoryGirl.define do
factory :widget do
sequence(:nickname) { |n| Faker::Lorem.words(2).join(' ') }
sequence(:fullname) { |n| "Full name for " + ????? }
end
end
Run Code Online (Sandbox Code Playgroud)
无论我把它放在哪里??? 去吧,我得到的#<FactoryGirl::Decl...不是昵称所设置的.
我尝试过name,name.to_s,name.value ......似乎没什么用.
我用:
gem 'rails', '3.2.11'
gem 'rspec-rails', '2.13.2'
gem 'webrat', '0.7.3'
gem 'factory_girl_rails', '4.1.0'
gem 'spork', '~> 0.9.0.rc'
Run Code Online (Sandbox Code Playgroud)
我想测试我的HP,我总是有一个指向某个用户的链接,因此HP的页面控制器包含:
@user = User.find(7)
Run Code Online (Sandbox Code Playgroud)
惠普的视图包含:
link_to 'See user', @user
Run Code Online (Sandbox Code Playgroud)
问题是所有测试都失败,因为测试数据库没有id为7的用户.我试过:
FactoryGirl.define do
factory :user do
name "Testuser"
id "7"
end
end
Run Code Online (Sandbox Code Playgroud)
......但这不起作用.始终存在错误:
规格如下:
describe "GET 'home'" do
before(:each) do
FactoryGirl.create(:user)
end
it "should be successful" do
get 'home'
response.should be_success
end
end
Run Code Online (Sandbox Code Playgroud)
失败/错误:获取'home'ActiveRecord :: RecordNotFound:找不到id = 7的用户
惠普在现实中工作得很好,只是测试失败了.我怎样才能保证这个测试不会失败?
我有一个用户模型和一个跟随者模型,这样用户可以有很多粉丝.因此,在跟随者模型的模式中,我有user_id列和follower_by_user_id列.因此,在跟随者模型中,许多粉丝可以跟随用户.用户ID存储在user_id列中,关注者ID的id存储在follow_by_user_id中.
class User < ActiveRecord::Base
has_many :followed_users, :class_name => 'Follower', :foreign_key => 'user_id'
has_many :followers, :class_name => 'Follower', :foreign_key => 'followed_by_user_id'
validates :email, presence: true, format:{ with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i}
validates :name,presence:true
end
Run Code Online (Sandbox Code Playgroud)
以上是用户模型
class Follower < ActiveRecord::Base
belongs_to :user
belongs_to :followed_by_user, :class_name => 'User', :foreign_key => 'followed_by_user_id'
validates :user, :followed_by_user, presence:true
validates_associated :user, :followed_by_user
end
Run Code Online (Sandbox Code Playgroud)
以上是跟随者模型
FactoryGirl.define do
factory :user do
name {Faker::Name.name}
email {Faker::Internet.email}
end
factory :follower do
user
followed_by_user_id
end
Run Code Online (Sandbox Code Playgroud)
followed_by_user_id基本上只是一个用户ID,或者我们可以说user_id是follow_by_user_id列的外键.Im plain English followed_by_user_id是跟随其他用户的用户的id.那么,如果任何正文可以帮助如何在follower工厂中为follower_by_user_id列包含此外键关系?
提前致谢.
你如何调试factory_girl?我试图把调试器放在那里,但我只是不能.我只想测试为什么我的关联不正常
我希望当我在工厂中进行更改时,我会在rails控制台中看到它们而不重新启动所有控制台.
我找到了一些线条并对它们进行了测试,对所发生的事情了解不多,文档对我来说并不清楚:
FactoryGirl.reload
Run Code Online (Sandbox Code Playgroud)
我也测试过:
> FactoryGirl.factories.clear
> FactoryGirl.find_definitions # also tested FactoryGirl.factories.find_definitions
# but NoMethodError is raised
=> ActiveRecord::RecordNotFound: Couldn't find Address with ID=277 Torphy Squares
Run Code Online (Sandbox Code Playgroud) 我有(简化)工厂定义如下:
factory :league do
acronym 'NBA'
end
factory :division do
league
end
Run Code Online (Sandbox Code Playgroud)
分部属于联盟.当我定义这个工厂时,我的假设就是创建一个联盟,并且这个联盟会一次又一次地被重复使用,以使分区成为真正的联盟.
相反,我在第二次通话时遇到错误,FactoryGirl.create(:division)因为联盟acronym应该是独一无二的.
class League < ActiveRecord::Base
validates :acronym, uniqueness: true
end
Run Code Online (Sandbox Code Playgroud)
在测试中导致以下中断
ActiveRecord :: RecordInvalid:验证失败:已经删除了缩略词
我该如何解决这个问题,最好不要在测试设置中创建层次结构?
如果我想要实现的目标比factory_girl更好,请建议
我的factories.rb文件变得太大而无法维护,我现在正试图将其拆分到factories目录中的许多文件中.问题是我不知道如何处理依赖项.
总而言之,我试图以下列方式分割我的工厂.所有序列都转到sequences.rb文件,每个工厂定义都转到单独的文件,如下所示:
工厂/ sequences.rb
FactoryGirl.define do
sequence :name {|n| "Name #{n}" }
sequence :email {|n| "person#{n}@example.com" }
end
Run Code Online (Sandbox Code Playgroud)
工厂/ user.rb
FactoryGirl.define do
factory :user do
name
email
end
end
Run Code Online (Sandbox Code Playgroud)
工厂/ post.rb
FactoryGirl.define do
factory :post do
name
content "Post Content"
user
end
end
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我得到的name是没有定义的错误.我可以通过传递一个块的每个关联(如处理这个name,email,user等)提及,但它似乎是丑陋和不干燥.
factory_girl知道应该加载哪些文件的序列?我有一个应用程序,用户可以使用多种服务登录,例如Google Plus,Facebook,Twitter等.
为了方便这一点,我有一个记录的基础User模型has_many Identity.
Identity记录都有一个provider字段(例如"Google","Facebook"等等),以指示用于登录的提供程序."Google" identities.我按如下方式设置工厂:
FactoryGirl.define do
factory :user do
sequence(:name) { |n| "Julio Jones-#{n}"}
sequence(:email) { |n| "julio.jones-#{n}@atl.com" }
after(:create) do |user|
create(:identity, user: user)
end
end
factory :identity do
user
provider "Google"
email { user.email }
password "password"
end
end
Run Code Online (Sandbox Code Playgroud)
该User模型具有创建Identity记录的回调.它运行时效果很好
user = FactoryGirl.create(:user)
Run Code Online (Sandbox Code Playgroud)
但是,如果我创造identity,而不是
identity = FactoryGirl.create(:identity)
Run Code Online (Sandbox Code Playgroud)
该identity工厂将首先尝试创建父user,这将反过来创建另一个identity.当它最终回到创建 …