Чтобы запустить код перед каждым тестом, используйте before
.Вы работаете здесь в контексте экземпляра, возможно, класса, неявно сгенерированного describe
, поэтому переменные экземпляра, заданные в before
, доступны в каждом тесте (например, внутри блока it
).
Чтобы запустить код перед всеми тестами, просто оберните тесты в классе, подклассе MiniTest::Spec
или любом другом;теперь перед самими тестами вы можете создать класс или модуль, установить переменные класса, вызвать метод класса и т. д., и все это будет доступно во всех тестах.
Пример:
require "minitest/autorun"
class MySpec < MiniTest::Spec
class MyClass
end
def self.prepare
puts "once"
@@prepared = "prepared"
@@count = 0
end
prepare
before do
puts "before each test"
@local_count = (@@count += 1)
end
describe "whatever" do
it "first" do
p MyClass
p @@prepared
p @local_count
end
it "second" do
p MyClass
p @@prepared
p @local_count
end
end
end
Вот вывод вместе с моими комментариями в фигурных скобках, объясняющими, что доказывает каждая строка вывода:
once [this code, a class method, runs once before all tests]
Run options: --seed 29618 [now the tests are about to run]
# Running tests:
before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
1 [the instance variable from the before block is visible in each test]
before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
2 [the instance variable from the before block is visible each test]
(Обратите внимание, что я не имею в виду, что этот вывод подразумевает какую-либо гарантию порядка вкакие тесты будут выполняться.)
Другой подход заключается в использовании существующего before
, но перенос кода выполняется только один раз в флаге переменной класса.Пример:
class MySpec < MiniTest::Spec
@@flag = nil
before do
unless @@flag
# do stuff here that is to be done only once
@@flag = true
end
# do stuff here that is to be done every time
end
# ... tests go here
end