【问题标题】:RSpec triggering after_save callback on in memory instance of object creationRSpec在对象创建的内存实例中触发after_save回调
【发布时间】:2015-09-30 21:26:29
【问题描述】:

当我测试特定项目时,我使用创建 ActiveRecord 对象的新实例

ObjectType.new(parameters)

RSpec 3.3(最新版本)中的这个实例化调用了该模型中的 after_save 回调。此行为与开发环境中实际发生的情况以及我在内存中创建新实例时所期望的情况不匹配。此外,如果我对运行它的测试执行 binding.pry,我可以检查数据库,实际上数据库中有一个由 RSpec 创建的持久对象,而不仅仅是使用内存中的对象。

为什么会出现这种行为,我应该如何解决?

更新:

因此,如果您有一个依赖于内存中 ActiveRecord 对象的依赖对象,然后将该对象保存到数据库中,那么内存中的对象也将被保存。

例如。

obj = ObjectType.new(parameters)
DependencyObject.create(relies_on: obj)

obj 对象会先被持久化到数据库中,然后再保存 DependencyObject。

【问题讨论】:

  • 你能展示一些你实际调用的代码吗?除非您覆盖 ActiveRecord 类的初始化程序,否则我敢打赌,在类似 before 块中还有另一行代码正在调用此对象的保存或在某处进行创建。
  • 啊!我想我找到了。看起来,当依赖对象被保存时,如果它们依赖于内存中的 ActiveRecord 中的对象,那么该对象也将被保存到数据库中。这似乎是我的问题,我有其他依赖项被创建并保存到数据库中,它们保存了我只在内存中创建的对象。我已经用我认为的问题更新了我的问题。
  • 看起来你已经回答了你的问题。与其把它放在你的问题中,为什么不创建一个答案,让人们知道这个问题有解决方案:)

标签: ruby-on-rails ruby ruby-on-rails-4 rspec


【解决方案1】:

因此,如果您有一个依赖于内存中 ActiveRecord 对象的依赖对象,然后将该对象保存到数据库中,那么内存中的对象也将被保存。

例如。

obj = ObjectType.new(parameters)
DependencyObject.create(relies_on: obj)

obj 对象将首先被持久化到数据库中,然后DependencyObject 将被保存。如果您在 after_create 上的 obj 上有一个回调,或者在执行 DependencyObject 的保存时会调用它,然后会发生另一个对象的保存,这可能会导致非常奇怪的回调行为。可能会非常令人沮丧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多