Rails 3 + Rspec 2:验证失败:邮件已经被占用



我有两个模型,UserBucketUser has_many Buckets and a Bucket belongs_to a 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

和我有一个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

我正在使用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

错误总是相同的:

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'

只有当我有Factory(:bucket)时才会发生。当我不添加Factory(:bucket)时,登录工作正常。

总是同样的错误。我已经尝试添加:email => Factory.next(:email)到用户,但没有成功。

编辑:

In 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> 
编辑2:

我发现错误是在关联中,但是,我不知道如何修复它。

  bucket.association :user

当你用关联定义一个工厂时,你需要在使用工厂时给这个工厂一个对象来关联。

这个应该可以工作:

describe "User authenticated: " do
  login_user
  @bucket = Factory(:bucket, :user => @user)
  it "should get index" do
    get 'index'
    response.should be_success
  end
end

这样一来,factorygirl就知道要制作一个与@user相关联的桶

在您的用户工厂中试试:

Factory.define :user do |f|
  f.sequence(:email) { |n| "test#{n}@example.com" }
  ...
end
我想那可能是你的问题。当你使用f.email = "anyvalue"时,它将每次使用该值。我看到你正试图在下一个块中创建一个序列,但我不确定该序列是否被使用。

还要注意,如果您的测试被崩溃或其他事情中断,有时虚假的测试数据可能会留在您的测试数据库中,而不是回滚。

我尝试的第一件事,如果工作一次,然后退出工作是重置测试数据库。

rake db:test:prepare

这会把所有东西都清理干净。

如果这不起作用,让我知道,我会再看看!

如果有人最近看到了你的观点。尝试使用数据库清理器。

查看更多信息:railstututual - chapter 8.4.3 -在集成测试中添加用户后测试数据库不清除

相关内容

  • 没有找到相关文章

最新更新