这是我遇到的情况的一个最小的通用示例:
测试/mytest.rb
describe "What I want to test" do
include TestUtils
temporary_change_value(settings, :tmp_setting, value)
describe "test1 blablabla" do
# ...
end
describe "test2 blablabla" do
# ...
end
end
测试/支持/test_utils.rb
module TestUtils
def self.included(base)
base.class_eval do
extend ClassMethods
before do
MyMainClass.interface = TestInterface.new
MyMainClass.handler.display.clear
end
after do
MyMainClass.handler.display.clear
end
end
end
module ClassMethods
def temporary_change_value(item, key, value)
old_value = nil
before do
old_value = item[key]
item[key] = value
end
after do
item[key] = old_value
end
end
end
end
该TestUtils
模块包含在每个测试文件中,因此始终执行公共before
和end
任务,但在这种情况下,我还需要将该方法temporary_change_value
用作该文件中所有测试的前块。这不起作用,似乎只有一个before
/end
块被执行(特别是设置的那个MyMainClass.interface
)
我尝试过的事情
我试图改变before
/end
块的顺序,就像这样。
describe "What I want to test" do
extend TestUtils::ClassMethods
temporary_change_value(settings, :tmp_setting, value)
include TestUtils
describe "test1 blablabla" do
# ...
end
describe "test2 blablabla" do
# ...
end
end
还是行不通。现在settings
值没有改变,所以它似乎是第二个before
/end
块,包括唯一一个被执行的。
问题:我怎样才能做到这一点并且仍然保持干燥?