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

hom*_*ast 2 validation rake unit-testing ruby-on-rails-3

试图在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>.
Run Code Online (Sandbox Code Playgroud)

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

one:
    name: MyString
two:
    name: MyString2
Run Code Online (Sandbox Code Playgroud)

测试仍然失败.

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

Dav*_*ulc 10

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

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

setup do
  @team = teams(:one)
end
Run Code Online (Sandbox Code Playgroud)

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

post :create, :team => @team.attributes
Run Code Online (Sandbox Code Playgroud)

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

尝试用此替换您的设置块

setup do
  @team = teams(:one)
  @team.name = 'unique name'
end
Run Code Online (Sandbox Code Playgroud)

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

  • 那么,现在你正在测试代码的方式;-).目标装置具有数据库的"基本场景":您知道数据库中的内容,因此您可以预测添加/创建模型时会发生什么,并将实际结果与断言进行比较.但是灯具有各自的问题,您可能希望在工厂(例如Factory Girl)的测试中定义数据库的内容. (3认同)