Мне было интересно, может ли кто-нибудь дать широкое объяснение (обзор высокого уровня) тестирования с использованием Minitest и Mocha в Rails и, возможно, когда использовать какие типы утилит тестирования.
Кажется, я застрял, не зная, когда использовать mock
против stub
, expects
против stubs
, а также порядок операций при издевательстве и окурке, и зная, как "сломать" функциональность кода.
Для примера (и да, я понимаю, что я тестирую побочные эффекты, но в этом случае я не знаю, что еще тестировать):
Класс для тестирования:
# frozen_string_literal: true
class UploadJob < ApplicationJob
queue_as :upload
def perform(batch_id)
Logger.new.time('upload.time') do
Uploader.new(batch_id).upload_data
end
end
end
Первоначальный тест, который не работал:
# frozen_string_literal: true
require 'test_helper'
class TestUploadJob < ActiveSupport::TestCase
test 'UploadJob > perform > it should start uploading' do
Logger.stubs(:new).then.stubs(:time).with('upload.time').yields
Uploader.expects(:new).with(1).then.expects(:upload_data)
UploadJob.perform_now(1)
end
Конечный результат теста, который работает:
# frozen_string_literal: true
require 'test_helper'
class TestUploadJob < ActiveSupport::TestCase
test 'UploadJob > perform > it should start uploading' do
logger_stub = stub
logger_stub.stubs(:time).with('upload.time').yields
Logger.stubs(:new).returns(logger_stub)
uploader_mock = mock
uploader_mock.expects(:upload_data)
Uploader.expects(:new).with(1).returns(uploader_mock)
UploadJob.perform_now(1)
end
Мне показалось, что в первом тесте было более декларативно говорить, что будет вызываться точный порядок вещей. Во втором тесте, который работает, сначала я заглушаю или высмеиваю вызов метода, который приходит после звонок на <CLASS>.new
.
Как лучше думать об этом / подходить к проблеме тестирования? Есть ли какие-нибудь полезные ресурсы , специфичные для тестирования с помощью Minitest и Mocha, НЕ Rspec , которые бы предлагались для чтения?
Спасибо!