![](/img/trans.png)
[英]Rails boolean attribute defaulting to true in tests but shouldn't be
[英]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_a
和location_b
時,測試通過並include?
返回false
,但是當我使用此代碼實例化location_a
和location_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.