RSpe c Не соответствует ожидаемому совпадению аргументов, несмотря на отсутствие различий - PullRequest
0 голосов
/ 12 июля 2020

Как вы ожидаете, что правильный ActiveRecord::Relation будет отправлен в качестве аргумента ключевого слова? Я видел подобную проблему раньше, и в прошлом использование сопоставления hash_including решало проблему, но не с ActiveRecord::Relation. Это так неприятно, потому что ошибка показывает, что нет diff между ожидаемым и фактическим полученным.

У меня есть spe c, который выглядит примерно так:

describe ProcessAccountsJob, type: :job do
  subject { described_class.new }
  let!(:incomplete) { create(:account, :incomplete_account) }

  it 'calls process batch service' do
    expect(ProcessAccounts).to receive(:batch).with(
      accounts: Account.where(id: incomplete.id)
    )
    subject.perform
  end
end

, и я получаю сообщение об ошибке, которое выглядит следующим образом:

  1) ProcessAccounts calls process batch service
     Failure/Error: ProcessAccounts.batch(accounts: accounts)

       ProcessAccounts received :batch with unexpected arguments
         expected: ({:accounts=>#<ActiveRecord::Relation [#<Account id: 14819, account_number: nil...solar: nil, pap: nil, types: [], annualized_usage: nil>]>})
              got: ({:accounts=>#<ActiveRecord::Relation [#<Account id: 14819, account_number: nil...solar: nil, pap: nil, types: [], annualized_usage: nil>]>})
       Diff:

     # ./app/jobs/process_accounts_job.rb:13:in `perform'
     # ./spec/jobs/process_accounts_job_spec.rb:9:in `block (2 levels) in <main>'

Как уже упоминалось, попытка использовать hash_including не помогает. Когда spe c изменяется на:

describe ProcessAccountsJob, type: :job do
  subject { described_class.new }
  let!(:incomplete) { create(:account, :incomplete_account) }

  it 'calls process batch service' do
    expect(ProcessAccounts).to receive(:batch).with(
      hash_including(accounts: Account.where(id: incomplete.id))
    )
    subject.perform
  end
end

, разница становится:

       -["hash_including(:accounts=>#<ActiveRecord::Relation [#<Account id: 14822, account_number: nil, service_address: \"123 Main St\", created_at: \"2020-07-12 15:50:00\", updated_at: \"2020-07-12 15:50:00\", solar: nil, pap: nil, types: [], annualized_usage: nil>]>)"]
       +[{:accounts=>
       +   #<ActiveRecord::Relation [#<Account id: 14822, account_number: nil, service_address: "123 Main St", created_at: "2020-07-12 15:50:00", updated_at: "2020-07-12 15:50:00", solar: nil, pap: nil, types: [], annualized_usage: nil>]>}]

1 Ответ

0 голосов
/ 12 июля 2020

Получается, что match_array сопоставитель решает проблему в этом случае; что вводит в заблуждение, потому что ни ожидаемое, ни фактическое не является массивом. ??‍♂️

describe ProcessAccountsJob, type: :job do
  subject { described_class.new }
  let!(:incomplete) { create(:account, :incomplete_account) }

  it 'calls process batch service' do
    expect(ProcessAccounts).to receive(:batch).with(
      accounts: match_array(Account.where(id: incomplete.id))
    )
    subject.perform
  end
end
...