2

Ruby Noob - 我搜索过 SO,阅读Rails Guide on Testing并观看了RailsCast,但运气不佳。

我无法协调方法关联与我编写的测试。目前(下面的代码),两个测试,一个检查姓名的存在和一个检查电子邮件的存在,没有失败或错误地通过——好的,看起来不错。

如果我从模型中删除两个 validates 语句,那么两个测试都会失败——这也是有道理的。

但是,如果我只删除其中一个

validates :name, :presence => true

或者

validates :email, :presence => true

从模型来看,两个测试都通过了,没有失败。这个结果对我来说没有意义。我是否创建了错误的测试?


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
4

1 回答 1

1

是的,您创建了错误的测试。在任何测试中,您只需要测试一个前提,因为在用户应该拥有名称的情况下,只要用户验证名称的存在。

首先让我们来看看为什么这两个测试在你的第三种情况下都通过了,因为模型中只有一个 validates 语句。

你的测试代码,

   用户 = User.new
   断言!user.save

所以如果你有validates :name, :presence => true或者validates :email, :presence => true

user.save 将返回 false,用户对象将不会保存,因为存在的任何验证都会生效。

您可能想要更改测试以检查名称上的错误

用户 = User.new
 断言!user.save
 断言!user.errors.get(:email).blank?
用户 = User.new
 断言!user.save
 断言!user.errors.get(:name).blank?

您可能还想看看https://github.com/thoughtbot/shoulda,有助于使编写测试更容易:)

于 2012-11-06T00:32:49.930 回答