【问题标题】:Adding validates_uniqueness_of to a model fails functional tests向模型添加 validates_uniqueness_of 功能测试失败
【发布时间】:2011-05-09 08:54:20
【问题描述】:

尝试在 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

测试仍然失败。

没有比这更基本的了;我错过了什么?

【问题讨论】:

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


    【解决方案1】:

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

    如果您查看 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
    

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

    【讨论】:

    • 非常感谢!现在我不确定这些装置的真正用途,但这很有帮助。你知道我做git rm -r test 的感觉有多糟糕吗?
    • 好吧,现在您正在测试代码的路上;-)。固定装置的目的是为您的数据库提供“基本场景”:您知道数据库中有什么,因此您可以预测添加/创建模型并将实际结果与断言进行比较时会发生什么。但是fixtures有自己的问题,你可能想研究在你的工厂测试中定义你的数据库的内容(比如Factory Girl)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多