我正在关注Michael Hartl的Rails教程。在chapter 6中,我们正在为用户名和电子邮件创建长度验证测试。
在test / models / user_test.rb文件中,他说要写
test "name should not be too long" do
@user.name = "a" * 51
assert_not @user.valid?
end
然后在app / models / user.rb中输入
class User < ActiveRecord::Base
validates :name, presence: true, length: { maximum: 50 }
我的问题是,测试如何确保名称不是,例如,60个字符长?我得到验证说最大长度为50,但是如果user.name EQUALS 51个字符...不大于或等于,则测试表明用户无效。
说实话,我不理解你在user.rb中需要验证的原因与测试文件之间的关系,这可能就是为什么我感到困惑。
答案 0 :(得分:2)
在测试中,您需要确保代码按预期执行所有操作。在这种情况下,您无法使用长度超过50个符号的name
来保存用户。这就是为什么在测试中你检查用户是否因name
长度== 51符号而无效。
但是你也是正确的,这个测试并不能保证名字长度为60的用户也是无效的。它也没有检查50是否是最大值,因为它将通过
validates :name, presence: true, length: { maximum: 1 }
例如,。但是你可能不希望你的应用程序像这样。这就是为什么我还鼓励你为最大允许长度添加另一张支票:
@user.name = "a" * 50
assert @user.valid?
通常,如果您怀疑代码中存在某些错误,您可以自由添加新测试。但在这种情况下,您不应该实际测试代码的行为方式,因为存在/长度验证在Rails本身中经过了充分测试。您应该检查是否在模型中包含了这些验证,并且传递了正确的参数。例如,在shoulda-matchers中你有这些助手:
should validate_presence_of(:name)
should validate_length_of(:name).is_at_most(50)
我不确定单元测试是否有类似物,很可能不是,所以你应该按照这样做的方式自己测试并假设这已经足够了。
答案 1 :(得分:1)
测试只是断言51个字符的用户名不应该是有效的。
测试没有确保&#39;用户名不能超过60个字符。这就是实际验证代码的作用。
例如,如果您要将验证代码更改为:
class User < ActiveRecord::Base
validates :name, presence: true, length: { maximum: 60 }
然后测试会失败,因为代码 验证了51个字符的用户名。