首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSpec -刷新关联

RSpec -刷新关联
EN

Stack Overflow用户
提问于 2018-11-14 14:44:01
回答 1查看 727关注 0票数 0

我有一个LabCollection:

代码语言:javascript
复制
class LabCollection < ApplicationRecord
  # Relationships
  belongs_to :lab_container, polymorphic: true, optional: true
  has_many :lab_collection_labs
  has_many :labs, -> { published }, through: :lab_collection_labs
  has_many :lab_collection_inclusions, dependent: :destroy
end

它有许多LabCollectionLabs:

代码语言:javascript
复制
class LabCollectionLab < ApplicationRecord
  acts_as_list scope: :lab_collection_id, add_new_at: :bottom
  belongs_to :lab_collection
  belongs_to :lab
end

它有实验室的身份证,属于实验室。

我有一个规范,它测试如何创建新的关联,并在以下几个方面进行了验证:

代码语言:javascript
复制
context 'when the lab container has labs already present' do
        it 'removes the present labs and adds the new ones' do
          subject = RawLabAdder
          expect(populated_lab_collection.labs).to eq labs
          subject.new(populated_lab_collection, [lab4.id, lab5.id]).perform
          expect(populated_lab_collection.labs).not_to eq labs
          binding.pry
          expect(populated_lab_collection.labs).to eq [lab4, lab5]
        end
      end

如果您需要查看代码的内部工作情况,请让我知道,但是问题似乎与RSpec和刷新关联有关。当我到达binding.pry点并调用populated_lab_collection.lab_collection_labs时

代码语言:javascript
复制
populated_lab_collection.lab_collection_labs
=>
[lab_collection_lab_4, lab_collection_lab_5]

但是,当我调用.labs时:

代码语言:javascript
复制
populated_lab_collection.labs
=>
[]

通过检查lab_collection_labs,我可以看到它们每个都有一个lab_id,并且存在一个用于这些ID的实验室。我相信我的问题是,我没有正确地刷新记录,但是我尝试过:

代码语言:javascript
复制
      # populated_lab_collection.reload
      # populated_lab_collection.lab_collection_labs.reload
      # populated_lab_collection.lab_collection_labs.each do |x|
      #   x.lab.reload
      # end
      # populated_lab_collection.labs.reload

任何关于如何让RSpec正确读取记录嵌套关联的建议都是非常感谢的。正如我在检查记录时所说的,它有两个lab_inclusion_labs,每个lab_inclusion_labs都有一个实验室,但是父记录显然没有实验室。

编辑: RawLabAdder类:

代码语言:javascript
复制
module LabCollections
  class RawLabAdder

    def initialize(incoming_lab_collection, lab_ids = [])
      @lab_ids = lab_ids
      @lab_collection = incoming_lab_collection
    end

    def perform
      remove_associated_labs
      add_labs
    end

    private

    def add_labs
      @lab_ids.each do |x|
        lab = Lab.find(x)
        LabCollectionInclusionAdder.new(@lab_collection, lab).perform
      end
    end

    def remove_associated_labs
      @lab_collection.lab_collection_inclusions.map(&:destroy)
      @lab_collection.lab_collection_labs.map(&:destroy)
    end
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-14 14:56:33

如果在预挂钩或规范中创建一个实例,然后对其执行一些与数据库相关的工作,那么您拥有的实例将不再引用最新的信息。

在断言之前尝试重新加载populated_lab_collection。

代码语言:javascript
复制
expect(populated_lab_collection.reload.labs).not_to eq labs
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53302806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档