Я думаю, что 1. путь. Затем в Rakefile вы можете обрабатывать все тесты одинаково, и если каждый тест независим или блокирует общий ресурс (база данных в вашем случае), у вас есть хорошо зарекомендовавший себя набор тестов.
Конечно, вы не хотите, чтобы на самом деле скопировали код блокировки/разблокировки. Я думаю, что способ поделиться кодом между вашими тестовыми примерами - это определить настраиваемый модуль, например, рекомендацию по документации (http://docs.seattlerb.org/minitest/), и включить этот модуль в те тесты, которые необходимо заблокировать базу данных, или сделать ваши тестовые таблицы наследуемыми из настраиваемого класса, который наследует Minitest :: Test, оба из которых вы можете добавить в свой тестовый помощник.
EDIT - В Коде:
module LockDb
#Replace this with the path to your actual database
DB_FILE = 'db'
def setup
@f = File.open(DB_FILE, 'r+')
@f.flock(File::LOCK_EX)
end
def teardown
@f.flock(File::LOCK_UN)
end
end
Вы бы включить это в тестовых классах, которые вы хотите заблокировать дб, как так:
class TestMeme < Minitest::Test
include LockDb
#Your tests
end
Чтобы увидеть, что это работает, вы можете настроить простой скрипт без рамки без ограничений, как и следующий, и повеселиться, запустив его в нескольких окнах (перед тем, как вы его запустите, обязательно запустите его touch db
):
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
module LockDb
#Replace this with the path to your actual database
DB_FILE = 'db'
def setup
@f = File.open(DB_FILE, 'r+')
@f.flock(File::LOCK_EX)
end
def teardown
@f.flock(File::LOCK_UN)
end
end
extend LockDb
#The setup hook is run before each test method in minitest
setup
puts "Locked"
#This would be one of your test methods
puts "Press Enter to unlock"
gets
#^This would be the end of one of your test methods
#The teardown hook is run before each test method in minitest
teardown
puts "Unlocked"
На комментарии: Если у вас уже есть эти методы, они будут замещать те, предоставляемый модуль, так что вам нужно изменить эти уже определенные методы для вызова super
так что версия предоставлена модуль также вызывается. (Деление модуля не имеет смысл и логически, вы всегда будете должны вызвать целую пару)
Если это кажется, что слишком много работы, вы также можете попробовать взять маршрут рейки, например,
namespace :old do
#put the old :test definition here
end
task :teardown => 'old:test' do
#the code
end
task 'old:test' => :setup
task :setup do
#the code
end
task :test => :teardown
Или вы можете использовать https://github.com/guillermo/rake-hooks.
Да, я понял, что поэтому я удалил комментарий. Я не контролирую, какие камни можно установить. Я дам вам знать, как я, наконец, решил это. Спасибо за помощь. Я хотел бы отметить ваш ответ как правильный, но не вижу этого. – user1344131
Резолюция оказалась намного проще, чем ожидалось. В test_helper.ds я добавил класс, который заблокировал базу данных. После этого класса я использовал Minitest.after_run {}, чтобы разблокировать базу данных. Нет необходимости в модулях или обновлении существующих тестовых классов! – user1344131