don*_*ald 8 rspec rspec2 rspec-rails ruby-on-rails-3 factory-bot
我有2个型号,User和Bucket.User has_many Buckets和Bucket belongs_toa User.
在factories.rb,我有:
Factory.define :user do |user|
user.email "teste@test.com"
user.password "foobar"
user.password_confirmation "foobar"
end
Factory.sequence :email do |n|
"person-#{n}@example.com"
end
Factory.define :bucket do |bucket|
bucket.email "user@example.com"
bucket.confirmation false
bucket.association :user
end
Run Code Online (Sandbox Code Playgroud)
我有一个login_user模块,如下所示:
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
@user = Factory.create(:user)
#@user.confirm!
sign_in @user
end
end
Run Code Online (Sandbox Code Playgroud)
我正在使用Spork和Watch,我Buckets_controller_spec.rb很简单:
describe "User authenticated: " do
login_user
@bucket = Factory(:bucket)
it "should get index" do
get 'index'
response.should be_success
end
...
end
Run Code Online (Sandbox Code Playgroud)
错误总是一样的:
Failures:
1) BucketsController User authenticated: should get index
Failure/Error: Unable to find matching line from backtrace
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken
# ./lib/controller_macros.rb:12:in `block in login_user'
Run Code Online (Sandbox Code Playgroud)
它只会发生在我拥有的时候Factory(:bucket).当我不添加时,登录工作正常Factory(:bucket).
它总是一样的错误.我试过添加:email => Factory.next(:email)到用户,但没有成功.
编辑:
在rails c test:
ruby-1.9.2-p180 :019 > bucket = Factory(:bucket, :email => "hello@hello.com")
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
ruby-1.9.2-p180 :018 > Bucket.create(:email => "hello@hello.com")
=> #<Bucket id: 2, email: "hello@hello.com", confirmation: nil, created_at: "2011-04-08 21:59:12", updated_at: "2011-04-08 21:59:12", user_id: nil>
Run Code Online (Sandbox Code Playgroud)
编辑2:
我发现错误在关联中,但是,我不知道如何解决它.
bucket.association :user
Run Code Online (Sandbox Code Playgroud)
使用关联定义工厂时,无论何时使用工厂,都需要为工厂提供关联的对象.
这应该工作:
describe "User authenticated: " do
login_user
@bucket = Factory(:bucket, :user => @user)
it "should get index" do
get 'index'
response.should be_success
end
end
Run Code Online (Sandbox Code Playgroud)
这样,factorygirl知道要制作一个与@user相关联的存储桶.
在您的用户工厂中尝试:
Factory.define :user do |f|
f.sequence(:email) { |n| "test#{n}@example.com" }
...
end
Run Code Online (Sandbox Code Playgroud)
我想这可能是你的问题.当你使用f.email = "anyvalue"它时,每次都会使用该值.我看到你试图在下一个块中创建一个序列,但我不确定序列是否被使用.
另外 - 请注意,如果您因崩溃或某些事情而中断测试,有时虚假测试数据可能会留在测试数据库中而不是回滚.
如果某些东西工作一次然后退出工作,我首先尝试重置测试数据库.
rake db:test:prepare
Run Code Online (Sandbox Code Playgroud)
这将清除一切.
如果这不起作用,请告诉我,我会再看看!
| 归档时间: |
|
| 查看次数: |
6917 次 |
| 最近记录: |