Rails声称表单有效

时间:2009-06-26 19:38:53

标签: ruby-on-rails ruby unit-testing

测试模型在rails中有效的最佳实践方法是什么?

例如,如果我有一个用户模型来验证email_address属性的唯一性,那么如何检查发布表单返回错误(或者更好,特别是返回该字段的错误)。

我觉得这应该是显而易见的事情,但正如我很快发现的那样,我仍然没有足够的词汇来有效地使用google ruby​​问题。

4 个答案:

答案 0 :(得分:2)

http://thoughtbot.com/projects/shoulda/

Shoulda包含用于测试验证器之类的宏以及许多其他内容。值得一试TDD。

答案 1 :(得分:2)

最简单的方法可能是:

class UserEmailAddressDuplicateTest < ActiveSupport::TestCase
  def setup
    @email = "test@example.org"
    @user1, @user2 = User.create(:email => @email), User.new(:email => @email)
  end

  def test_user_should_not_be_valid_given_duplicate_email_addresses
    assert !@user2.valid?
  end

  def test_user_should_produce_error_for_duplicate_email_address
    # Test for the default error message.
    assert_equal "has already been taken", @user2.errors.on(:email)
  end
end

当然,您可能不希望为此行为创建单独的测试用例,在这种情况下,您可以复制setup方法中的逻辑并将其包含在两个测试中(或将其置于私有方法中)

或者,您可以将第一个(引用)用户存储在fixtures/users.yml等工具中,并在每个测试中简单地实例化一个具有重复地址的新用户。

你认为合适的重构!

答案 2 :(得分:2)

errors.on就是你想要的

http://api.rubyonrails.org/classes/ActiveRecord/Errors.html#M002496

如果字段有效,则

@ obj.errors.on(:email)将返回nil;如果存在一个或多个错误,则返回字符串或字符串数​​组中的错误消息。

答案 3 :(得分:1)

通过单元测试测试模型当然是第一步。但是,这并不一定能保证用户能够获得所需的反馈。

Section 4 of the Rails Guide on Testing有很多关于功能测试的好信息(即测试控制器和视图)。这里有几个基本选项:检查flash中是否有关于错误的消息,或使用assert_select查找在发生错误时应生成的实际HTML元素。后者实际上是测试用户实际收到消息的唯一方法。