我正在从事 Ruby on Rails 项目并使用 Minitest 实践测试驱动开发 (TDD)。
对于用户身份验证(使用 Devise),我编写了一个测试来检查用户是否无法在没有电子邮件的情况下注册。但是,我还有其他必需属性,例如 first_name、last_name、username 和 password。
这让我想到:
- 我应该为每个缺失的属性编写单独的测试吗?
- 或者测试一个缺失的属性是否足够,因为Rails已经在模型级别强制验证:presence,true?
另一位开发人员建议,如果我对多个属性进行存在性验证,我也应该为每个属性编写一个测试。他们的理由是,每个实现的功能都应该进行测试。他们还建议使用循环方法来避免冗余代码,而不是编写多个几乎相同的测试。
我知道,从 TDD 的角度来看,我先编写测试,然后编写代码使其通过,对缺失属性进行循环测试会迫使我为每个字段实施存在性验证。这确保我不会意外忘记任何一个字段。然而,从更务实的角度来看,当 Rails 已经在模型级别强制执行存在性验证时,我仍然怀疑这种级别的测试是否有必要。
很想听听这里的最佳实践——经验丰富的 Rails 开发人员如何处理这个问题?
这是我目前进行的测试:
test "user cannot sign up without email" do
post user_registration_path, params: {
user: {
first_name: "Test",
last_name: "User",
username: "testuser",
email: "",
password: "password123",
password_confirmation: "password123",
}
}
assert_response :unprocessable_entity
end
我同意 engineersmnky 在评论中所说的话。如果您的模型对这些属性进行了存在性验证,则您需要为模型测试中的每个验证编写单元测试。
如果您有一个
User
模型,我希望您也有一个UserTest
类似下面的模型:然后,在测试请求流时,您可能需要为快乐路径场景编写一个测试,并为不快乐路径编写一个通用测试。
类似于:
请注意,此处的“不满意路径”测试几乎与您问题中的测试相同(唯一的区别在于测试描述)。但按照这种方法,一次不满意测试就足够了。您不必测试电子邮件是否应该出现在每个用户中,您应该在此处测试的是您的控制器是否正确处理了用户可能无效的情况,无论原因如何。