测试模型在rails中有效的最佳实践方法是什么?
例如,如果我有一个用户模型来验证email_address属性的唯一性,那么如何检查发布表单返回错误(或者更好,特别是返回该字段的错误)。
我觉得这应该是显而易见的事情,但正如我很快发现的那样,我仍然没有足够的词汇来有效地使用google ruby问题。
答案 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元素。后者实际上是测试用户实际收到消息的唯一方法。