2009-06-26 68 views
0

什么是测试模型在rails中是否有效的最佳实践方法?例如,如果我有一个用户模型验证email_address属性的唯一性,那么如何检查发布的表单是否返回了错误(或者更好,特别是为该字段返回了错误)。Rails断言表单有效

我觉得这应该是显而易见的事情,但正如我很快发现的,我仍然没有完全掌握有效的谷歌问题的词汇。

回答

2

最简单的方法很可能是:

class UserEmailAddressDuplicateTest < ActiveSupport::TestCase 
    def setup 
    @email = "[email protected]" 
    @user1, @user2 = User.create(:email => @email), User.new(:email => @email) 
    end 

    def test_user_should_not_be_valid_given_duplicate_email_addresses 
    assert [email protected]? 
    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 

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

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

您认为合适的重构!

2

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

早该包括许多其他的东西一起进行测试之类的东西验证宏。值得检查TDD。

+0

应该是岩石!真正有用的插件,用于改进测试套件和编写DRY测试。 – 2009-06-26 22:47:41

1

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

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