tl;dr: 配列に正しいアイテムが追加されたことをテストしようとしていました。テストを実行すると、無差別に配列に追加されていることがわかりました。ただし、LessonPackage.available の最初の行に binding.pry を配置すると、テストは成功しますが、他の 2 つのテストは失敗します。
ここにいくつかのコードがあります。
元のテストでは、正しい数の項目が配列に追加されることをテストしました。これは :current スコープをテストします。テストは次のとおりです。
describe 'manage multiple lessons' do
before :all do
@six_package = create(:lesson_package)
@thirteen_package = create(:lesson_package, name: 'thirteen', number_of_lessons: 13)
@old_package = create(:lesson_package, name: 'canceled', current: false)
@instructor = create(:instructor, base_lesson_price: 50, contract_rate: 40)
end
context 'available' do
it 'return array of all available package managers when given defaults' do
packages = LessonPackage.available(@instructor)
packages.length.should be 2
packages[0].class.should be LessonPackageManager
end
end
end
@old_package の「current」属性を false にする必要があることに注意してください。テスト中のコードは次のとおりです。
class LessonPackage < ActiveRecord::Base
...
scope :current, where(current: true)
...
def self.available(instructor, method = 'self', lesson_type = 'private')
LessonPackage.current.map do |package|
manager = LessonPackageManager.make_package(instructor, package, lesson_type)
manager.send(method)
end
end
end
テストは失敗します!しかし、このコードが機能することはわかっています。これは、開発モードで機能するためだけでなく、バインディング.pry を LessonPackage.available の最初の行に配置すると、突然機能するからです! しかし今、別のテストが壊れています:
describe 'managed lesson' do
before :all do
@six_package = create(:lesson_package)
@instructor = create(:instructor, base_lesson_price: 50, contract_rate: 35)
end
describe 'booking lessons with a student' do
before :each do
@student = create(:student, area: 'herethere')
package_manager = LessonPackage.manage('six', @instructor)
package_manager.add_to_cart(@student)
end
subject {LessonBooking.first}
its(:lesson_package) {should eq @six_package}
end
end
end
これは、最初のレッスン予約に添付されたレッスン パッケージが、作成された元のレッスン パッケージとは異なる ID を持っているためです。注: このテストは以前は機能していました。唯一の違いは binding.pry です。
私はdatabase_cleanerを使用していますが、これは私が設定した方法です:
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end