3

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
4

0 に答える 0