モックが機能してくれない

あるjobのテストで、モックを使おうとしておりました。

ちゃんとかけている気がするのですが、モックが機能してくれておりません。。。

解決できておりませんが、試してみた内容について書いておこうと思います。。。

 

 

どんなモックを作りたいか

pdfを作成するjobのテストを書いておりました。

そのjobのperformメソッドの中で、

  1. pdfの作成
  2. pdf, pdf_size, pdf_pageの保存
  3. pdf_sizeとpdf_pageが一定より大きかったらステータス更新

という処理を行っておりました。

pdf_sizeとpdf_pageの大きさによってステータスが更新される部分のテストを作成しており、実際にテストしたい大きさのpdfを用意するのは大変だったのでモックで作成しようと考えました。

pdfオブジェクトをモックで作成し、サイズを返すメソッドが呼ばれたらテストしたい値のサイズを返してくれるようなモックです。

 

 

実装

app/jobs/pdf_creation_job

class PdfCreationJob < ApplicationJob
include ConvertToPdf


def perform(invoice)
@invoice = invoice
temp_path = Rails.root.join('tmp', "#{@invoice.id}.pdf")
pdf = convert_to_pdf(@invoice)

File.open(temp_path, 'wb') do |file|
file << pdf
pdf_page = CombinePDF.new(pdf).pages.length
if pdf.size < MAX_PDF_SIZE && pdf_page <= MAX_PDF_PAGE
@invoice.update!(pdf: file, pdf_size: pdf.size, pdf_page: pdf_page)
else
@invoice.update!(pdf: file, pdf_size: pdf.size, pdf_page: pdf_page, status: :invalid_pdf)
end
end
end
end

 

spec/jobs/pdf_creation_job_spec.rb


context
"pdf_size > 8MB" do

it "pdf_size8MB以上で保存されること" do
pdf = double('Pdf')
allow(pdf).to receive(:size).and_return(9 * 1024 * 1024)
pdf_creation_job = PdfCreationJob.new
allow(pdf_creation_job).to receive(:convert_to_pdf).and_return(pdf)
PdfCreationJob.perform_now(size_over)

expect(pdf).to receive(:size)
expect(invoice.pdf_size).to be > (8 * 1024 * 1024)
end

 

実行結果

Failures:

  1) PdfCreationJob#perform_later pdf作成 pdf_size > 8MB pdf_size8MB以上で保存されること

     Failure/Error: expect(invoice.pdf_size).to be > (8 * 1024 * 1024)

       expected: > 8388608

            got:   10

     # ./spec/jobs/pdf_creation_job_spec.rb:57:in `block (5 levels) in <top (required)>'

 pdf.size が呼ばれた時 9*1024*1024 を返して欲しいのに上手くいっておりません。。。

expect(pdf).to receive(:size) のexpectは通っているのでモックはきちんと呼ばれているようです。

and_return部分がおかしいのかもしれません。

 

 

感想その他

モック面白いし使いこなせば色んな条件のテスト作れるので極めていきたいです!!