2010-11-12 82 views
2

试图在轨道3添加validates_uniqueness_of到模型失败的功能测试

一个简单的应用程序。如果我创建了一个团队模型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>. 

我修改测试/夹具/ teams.yml看起来像这样:

one: 
    name: MyString 
two: 
    name: MyString2 

测试仍然失败。

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

回答

10

夹具基本上代表了数据库中的模型实例。

如果你看一下测试/功能/ teams_controller_test.rb的顶部,你会看到

setup do 
    @team = teams(:one) 
end 

,然后在发生故障的功能测试,你将有

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

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

尝试用这种

setup do 
    @team = teams(:one) 
    @team.name = 'unique name' 
end 

更换您的安装块现在你将创​​建一个新的团队名称为“唯一名称”(根据灯具这是不是在数据库中),和您的测试会通过。

+1

非常感谢!现在我不确定这些灯具的真正目的,但这非常有帮助。你知道我觉得做一个'git rm -r test'有多糟糕吗? – hometoast 2010-11-30 12:01:23

+3

那么,现在你正在测试代码;-)。目标设备具有的是数据库的“基本场景”:您知道数据库中的内容,因此您可以预测添加/创建模型时应该发生的情况,并将实际结果与断言进行比较。但是灯具有自己的一套问题,你可能想要在工厂测试中定义你的数据库的内容(比如Factory Girl)。 – 2010-11-30 14:07:14