【问题标题】:AssociationTypeMismatch but `expected` and `got` are the same class with the same object idAssociationTypeMismatch 但 `expected` 和 `got` 是具有相同对象 id 的同一类
【发布时间】:2020-02-04 05:58:46
【问题描述】:

这是一个 Rails 应用程序。导轨 5.1,Rspec 3.6。我的 Rspec 测试套件中的测试失败,我无法理解错误消息。据我所见,该关联期望并获得完全相同的对象,但它仍然抛出错误。对于理解此错误并努力解决问题的任何见解,我将不胜感激。

相关(最小)模型定义:

class Member < ApplicationRecord
  belongs_to :membership, inverse_of: :members
  belongs_to :patient
end
class Patient < Client
  has_many :members, dependent: :destroy
end

错误:

Failure/Error: return if member.update(membership: membership, patient: person)

     ActiveRecord::AssociationTypeMismatch:
       Patient(#47184337056660) expected, got #<Patient id: 163, ...> which is an instance of Patient(#47184337056660)

【问题讨论】:

  • 添加失败的测试。

标签: ruby activerecord rspec ruby-on-rails-5


【解决方案1】:

在您的规范中看起来您期望一个类,但正在返回该类的一个对象。

Patient(#47184337056660) 预期,得到 # 这是 Patient(#47184337056660) 的一个实例

这是一个关键信息: 这是

的一个实例

很难判断您是否需要修复规范或代码,因为您根本没有分享规范。

【讨论】:

    【解决方案2】:

    对于未来的线程读者,我发现了问题:

    测试已对 is_a? 方法进行存根处理,以针对这个特定的 Patient 实例返回 false。

    天知道为什么 3 个月前的我会这样做!

    Under the hood rails 使用此方法来确认正确的关联对象类型。在这种情况下,rails 检查了实例 is_a?(Patient) 是否返回 false。所以病人实例表现得好像它不是Patient 类的实例

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      相关资源
      最近更新 更多