我从Rails中的TDD开始了我的旅程,遇到了一个关于模型验证测试的小问题,我似乎找不到解决方案.假设我有一个用户模型,

class User < ActiveRecord::Base
  validates :username, :presence => true
end

还有一个简单的测试

it "should require a username" do
  User.new(:username => "").should_not be_valid
end

这正确地测试了状态验证,但是如果我想更具体一点呢?例如,在errors对象上测试完整的_消息..

it "should require a username" do
  user = User.create(:username => "")
  user.errors[:username].should ~= /can't be blank/
end

我对最初try (使用should_无效)的担心是RSpec不会产生描述性错误消息.它只是说"预期有效?返回false,得到true."然而,第二个测试示例有一个小缺点:它使用create方法而不是新方法来获取errors对象.

我希望我的测试更具体地说明他们正在测试什么,但同时不必接触数据库.

有人有什么意见吗?

推荐答案

恭喜你和ROR一起努力进入TDD,我保证一旦你开始,你不会回头.

最简单的快速而肮脏的解决方案是在每次测试之前生成一个新的有效模型,如下所示:

 before(:each) do
    @user = User.new
    @user.username = "a valid username"
 end

但我建议你为所有的模型建立工厂,自动生成一个有效的模型,然后你可以搞乱各个属性,看看你的验证是否正确.我喜欢用FactoryGirl来表示:

基本上,一旦你准备好了,你的测试就会像这样:

it "should have valid factory" do
    FactoryGirl.build(:user).should be_valid
end

it "should require a username" do
    FactoryGirl.build(:user, :username => "").should_not be_valid
end

哦,是的,这里有a good railscast个比我更能解释这一切:

祝你好运:)


UPDATE: As of 100 the syntax for factory girl has changed. I have amended my sample code to reflect this.

Ruby-on-rails相关问答推荐

Rails 7.1,登录到STDOUT和LOG/Production.log

会话控制器中的某种问题

如何在哪里查询 Rails 模型中定义的方法

为什么总是有东西在我的 mac 上的 5000 端口运行

GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

如何获取 Rails 表单构建器将为某个字段生成的 HTML名称属性?

rails 3:将链接显示为按钮?

Rails:包含多态关联

添加自定义字段/列以使用 Rails 4 进行设计

link_to 将参数与 url 一起发送并在目标页面上抓取它们

如何为模型添加属性?

Rails SQL 正则表达式

在rails国际化yml文件中传递变量

如何为 rspec 设置 ENV 变量?

Rails 3 返回 HTTP 406 Not Acceptable?

rails 获取应用程序根/基本 url

从 Rails 中的 ActiveRecord::RecordNotFound 救援

RoR select_tag 默认值和选项

将数组传递到 hidden_​​field ROR

为什么 Rails 需要 JavaScript 运行时?