Rspec中expect和is_expected.to之间的差异

时间:2016-04-25 05:10:10

标签: ruby-on-rails ruby rspec

这些关键字之间有什么区别。

在以下示例中,使用expect通过了测试,而is_expected.to失败了。

it { expect validate_uniqueness_of(:access_token) }

it { is_expected.to validate_uniqueness_of(:access_token) }

测试由{Devise

生成的类User
class User < ActiveRecord::Base
  devise :lockable, :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  validates :access_token, uniqueness: true

  before_validation :generate_access_token!, on: :create

  def generate_access_token!
    begin
      self.access_token = Devise.friendly_token
    end while User.find_by(access_token: self.access_token)
  end
end

1 个答案:

答案 0 :(得分:4)

is_expected_to只是写作的缩写版本

expect(subject).to

你的第一个规范通过,因为它根本没有测试任何东西。

第二个规范失败,因为没有唯一性验证。尽管您的代码正在处理重复项(但具有与验证相同的竞争条件),但它以不同的方式执行此操作:它生成新令牌,而不是报告错误。验证匹配器通常通过检查对象的errors哈希来工作,而您的代码没有设置,因此规范失败。