Ruby Noob - 我搜索了SO,阅读了Rails Guide on Testing,看了RailsCast没有运气。
我无法将方法关联与我编写的测试相协调。目前(下面的代码),两个测试,一个检查名称的存在和一个检查是否存在电子邮件,通过没有失败或错误 - 好吧,似乎很好。
如果我从模型中删除两个验证语句,则两个测试都会失败 - 这也是有意义的。
但是,如果我只删除 ONE
validates :name, :presence => true
或
validates :email, :presence => true
从模型中, BOTH 测试通过而没有失败。这个结果对我来说没有意义。我创建了错误的测试吗?
user.rb型号:
class User < ActiveRecord::Base
attr_accessible :email, :name
has_many :connections
validates :name, :presence => true
validates :email, :presence => true
end
测试/单元/ user_test.rb
require 'test_helper'
class UserTest < ActiveSupport::TestCase
test "a user should have a name" do
user = User.new
assert !user.save
end
test "a user should have an email" do
user = User.new
assert !user.save
end
end
答案 0 :(得分:1)
是的,您创建了错误的测试。在任何测试中,您只需要测试一个前提, 如在用户应具有名称,只需用户验证名称的存在。
首先让我们考虑为什么两个测试都会在第三种情况下通过,因为模型中只有一个验证语句存在。
您的测试代码,
user = User.new assert !user.save
因此,如果您有validates :name, :presence => true
或validates :email, :presence => true
user.save
将返回false,用户对象将无法保存,因为无论哪个验证都会生效。
您可能希望更改测试以检查名称上的错误。
user = User.new assert !user.save assert !user.errors.get(:email).blank?
user = User.new assert !user.save assert !user.errors.get(:name).blank?
您可能还想看看https://github.com/thoughtbot/shoulda,有助于简化编写测试:)