将validates_uniqueness_of添加到模型会导致功能测试失败

时间:2010-11-12 23:32:05

标签: unit-testing validation ruby-on-rails-3 rake

尝试在rails 3中创建一个简单的应用程序。

如果我使用rails g scaffold team name:string && rake db:migrate创建团队模型,然后运行rake,我会从预建测试中获得成功。

如果我只是将validates_uniqueness_of :name添加到团队模型中。功能测试失败

  1) Failure:
test_should_create_team(TeamsControllerTest) [/test/functional/teams_controller_test.rb:20]:
"Team.count" didn't change by 1.
<3> expected but was
<2>.

我修改了tests / fixtures / teams.yml看起来像这样:

one:
    name: MyString
two:
    name: MyString2

测试仍然失败。

它不能比这更基本;我错过了什么?

1 个答案:

答案 0 :(得分:10)

Fixtures基本上代表数据库中的模型实例。

如果你看一下test / functional / teams_controller_test.rb的顶部,你会看到

setup do
  @team = teams(:one)
end

然后在你失败的功能测试中你会有

post :create, :team => @team.attributes

这就是正在发生的事情:你正在尝试创建一个与“团队命名为:one”属性相同的新团队。由于两者具有相同的名称(因为它们具有完全相同的属性),因此唯一性验证失败。

尝试使用此

替换您的设置块
setup do
  @team = teams(:one)
  @team.name = 'unique name'
end

现在,您将创建一个名为“唯一名称”的新团队(根据灯具不在数据库中),您的测试将通过。