簡體   English   中英

Rails .include? 在不應該返回的情況下返回true

[英]Rails .include? returns true when it shouldn't

我正在RSpec中測試ActiveRecord模型,並且試圖通過實例化模型而不是創建FactoryGirl模型來加快測試速度,但是ActiveRecord::Associations::CollectionProxy.include? 當我期望false時返回true

我正在測試的代碼是Schedule模型中的此方法,該方法傳遞了Location模型的實例的參數...

def available_at_location(location)
  locations.include?(location)
end

測試是...

before do
  subject.locations = [location_b]
end

it 'returns false' do
  result = subject.available_at_location(location_a)

  expect(result).to be(false)
end

當我使用FactoryGirl創建location_alocation_b時,測試通過並include? 返回false ,但是當我使用此代碼實例化location_alocation_b時,測試失敗並包含? 返回true

let(:location_a) { Location.new(name: 'London') }
let(:location_b) { Location.new(name: 'York') }

打印locations表明它是一個包含location_b的CollectionProxy,而打印location參數表明它是location_a ,都具有正確的屬性。 並且, include? 是否傳遞location參數,則返回true

編輯:一些其他代碼。

這是定義主題的代碼...

subject { described_class.new(locations: [location_a]) }

這是FactoryGirl Location工廠的代碼...

require 'faker'

FactoryGirl.define do
  factory :location do
    name { Faker::Company.name }
    address { Faker::Address.street_address }
    city { Faker::Address.city }
    zipcode { Faker::Address.zip_code }
    landline { Faker::PhoneNumber.phone_number }
    association :organization
  end
end

注意我已經嘗試向構造函數提供一個組織( Location.new(name: 'London', organization: Organization.new) ),但是它不會更改輸出。

由於兩個記錄都是新記錄,並且id == nil include? ,所以CollectionProxy通過其id比較模型include? 返回true

要進行測試,您必須將模型保存到db(使用create!等)。

我已經解決了。 如果有人遇到類似問題,我將在此處進行記錄。 這些行是問題所在...

subject { described_class.new(locations: [location_a]) }

before do
  subject.locations = [location_b]
end

當使用模型實例而不是FactoryGirl創建的完整數據庫模型時,ActiveRecord不會更新CollectionProxies中項目的更改。 至於它的關注locations總是[location_a]即使你改變了項目[location_b]

解決方案是只分配一次屬性。

subject { described_class.new(locations: []) }

before do
  subject.locations = [location_b]
end

將每個上下文的before塊中的位置設置為所需位置。

我確定這與對Collection / CollectionProxy的引用有關,但是這超出了我的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM