Ruby on rails 在rails中测试单个属性时,获取;can';“不要为零”;所有其他属性的错误

Ruby on rails 在rails中测试单个属性时,获取;can';“不要为零”;所有其他属性的错误,ruby-on-rails,validation,testing,rspec,attributes,Ruby On Rails,Validation,Testing,Rspec,Attributes,所以,我有一个不寻常的问题,我真的不知道如何解决。从本质上讲,它很难搜索,所以我将尽可能地描述它并提供示例。当我在rspec中测试任何模型的单个属性时,如果该模型具有特定的属性,例如数值性或唯一性,我会得到一个错误,表示其他属性不能为空,而不是rspec期望的一个错误。我将发布我的用户模型,因为这是最简单的 型号: class User < ActiveRecord::Base validates :name, :email, :password, presence: true #

所以,我有一个不寻常的问题,我真的不知道如何解决。从本质上讲,它很难搜索,所以我将尽可能地描述它并提供示例。当我在rspec中测试任何模型的单个属性时,如果该模型具有特定的属性,例如数值性或唯一性,我会得到一个错误,表示其他属性不能为空,而不是rspec期望的一个错误。我将发布我的用户模型,因为这是最简单的

型号:

class User < ActiveRecord::Base
  validates :name, :email, :password, presence: true
  # validates :email, uniqueness: true
end
规格:

使用上述规范的错误示例:

  5) User attributes should ensure password has a length of at least 8
     Failure/Error: it { should ensure_length_of(:password).is_at_least(8) }

       Expected errors to include "is too short (minimum is 8 characters)" when password is set to "xxxxxxx", got errors: ["name can't be blank (nil)", "email can't be blank (nil)"]

     # ./spec/models/user_spec.rb:17:in `block (3 levels) in <top (required)>'
5)用户属性应确保密码的长度至少为8
失败/错误:它{应该确保长度为(:密码)。是否至少(8)}
密码设置为“xxxxxxx”时,预期错误包括“太短(最少8个字符)”,出现错误:[“名称不能为空(nil)”,“电子邮件不能为空(nil)”]
#./spec/models/user_spec.rb:17:in'block(3层)in'
这就是我指的。我试图测试密码的长度限制,但它错误地告诉我名称不能为零,电子邮件不能为零。但我使用的是上面的一个工厂,以及其他验证存在的测试,比如说,名称,不会失败


非常感谢您的帮助。我还可以发布任何你感兴趣并认为有帮助的东西,例如。;gemfile、rspec config等。

它并没有告诉您这些错误是一个问题,而是告诉您它希望输入一个密码太短,但没有。然后它转储数组中确实包含的错误,以便您可以进行检查

这很有意义,因为在您的模型中,您没有验证长度:

validates :name, :email, :password, presence: true
尝试将其添加到您的用户类:

validates_length_of :password, minimum: 8

嗯,我想我的困惑是,当rspec测试这个时,我预期会出现某种错误。因此,如果没有验证存在,我不应该得到任何错误作为我的线索,测试没有通过吗?相反,它似乎只是给了我其他一切的错误。我看到了混乱。单个规范仅测试密码验证的长度。它只设置密码,并且只查找密码的错误消息。其他为null的字段是错误,但它们与规范无关,但它不知道这一点,因此错误消息有点混乱。其他规范可能有密码长度错误消息,但除非在不同的验证中发生类似错误,否则您永远不会看到这些消息。
validates :name, :email, :password, presence: true
validates_length_of :password, minimum: 8