ruby-on-rails - Rails 3.1,RSpec : testing model validations

标签 ruby-on-rails ruby-on-rails-3 rspec rspec2 rspec-rails

我已经开始了 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

这正确地测试了存在验证,但如果我想更具体怎么办?例如,在错误对象上测试 full_messages..

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

我对最初尝试(使用should_not be_valid)的担忧是RSpec不会产生描述性错误消息。它只是说“预期有效?返回 false,得到 true”。然而,第二个测试示例有一个小缺点:它使用 create 方法而不是 new 方法来获取错误对象。

我希望我的测试能够更具体地说明他们正在测试的内容,但同时不必接触数据库。

有人有什么意见吗?

最佳答案

恭喜您通过 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这比我更好地解释了这一切:

<小时/>

更新:截至version 3.0工厂女孩的语法已经改变。我修改了示例代码以反射(reflect)这一点。

关于ruby-on-rails - Rails 3.1,RSpec : testing model validations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537112/

相关文章:

rspec - page.should have_content - 导致错误的特殊字符

ruby-on-rails - Golang 微服务和与现有应用程序的通信

ruby-on-rails - 在 Controller 中渲染液体模板

ruby-on-rails - rake spec 在 specs 之后运行测试

ruby-on-rails - 使用 Capybara Webkit 模拟 RSpec 功能规范中的外部 SSO 登录

ruby-on-rails - Dreamhost上的Rails 3?

ruby-on-rails - Rails Controller 的常见过滤器

ruby-on-rails - 如何使用机架中间件代理 AJAX 请求?

ruby-on-rails - View 内的 Rails 布局名称

ruby-on-rails - 执行JS :Runtime Error somehow related to javascript/coffeescript