为什么我必须在使用客户验证器后重新加载rspec中的记录?

rai*_*400 6 ruby rspec ruby-on-rails

我有一个模型User,它在创建后在回调中创建了选项

# User
has_one :user_options

after_create :create_options

private

def create_options
  UserOptions.create(user: self)
end
Run Code Online (Sandbox Code Playgroud)

我有一些简单的Rspec报道:

describe "new user" do
  it "creates user_options after the user is created" do
    user = create(:user)
    user.user_options.should be_kind_of(UserOptions)
  end
end
Run Code Online (Sandbox Code Playgroud)

在我向用户模型添加自定义验证之前,一切正常.

validate :check_whatever, if: :blah_blah
Run Code Online (Sandbox Code Playgroud)

现在规范失败了,让它通过的唯一方法是重新加载规范中的记录:

it "creates user_preferences for the user" do
  user = create(:user)
  user.reload
  user.user_options.should be_kind_of(UserOptions)
end
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

pho*_*oet 1

首先,我建议阅读这篇关于调试 Rails 应用程序的文章:http://nofail.de/2013/10/debugging-rails-applications-in-development/

其次,我建议对您的代码进行一些更改:

def create_options
  UserOptions.create(user: self)
end
Run Code Online (Sandbox Code Playgroud)

应该

def create_options
  self.user_option.create
end
Run Code Online (Sandbox Code Playgroud)

这样您就不必在保存后重新加载对象,因为该对象在其关系中已经具有新的 UserOptions 实体。

create(:user)假设您正在使用固定装置的代码。您在 user.yml 中使用的数据以及您编写的验证可能存在问题,但遗憾的是没有在此处发布。