モックが機能してくれない
あるjobのテストで、モックを使おうとしておりました。
ちゃんとかけている気がするのですが、モックが機能してくれておりません。。。
解決できておりませんが、試してみた内容について書いておこうと思います。。。
どんなモックを作りたいか
pdfを作成するjobのテストを書いておりました。
そのjobのperformメソッドの中で、
- pdfの作成
- pdf, pdf_size, pdf_pageの保存
- 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部分がおかしいのかもしれません。
感想その他
モック面白いし使いこなせば色んな条件のテスト作れるので極めていきたいです!!