如何在minitest中开始测试运行之前立即调用方法

时间:2014-11-18 10:21:53

标签: ruby unit-testing minitest

我在通过端到端测试测试大型分布式系统时遇到以下情况:

Class A < Minitest::Spec

  before do 
    # stuff

    setup_runtime_environment
  end

end

Class B < Class A

  before do 
    # stuff
  end

end

Class C < Class B

  before do 
    # stuff
  end

end

有些测试仅从Class A继承 - 它是最通用的,包含与测试整个系统相关的内容。

Class B更具体 - 它包含与大量测试相关的内容,但仍需要通过setup_runtime_environment

中的Class A方法进行设置

Class C是最具体的 - 它包含的内容仅与一小组测试相关,但仍需要通过setup_runtime_environment Class A方法进行设置>

问题在于,为了各种测试目的,运行时环境需要以不同的方式进行配置。测试与&#39; general&#39;测试与特定的&#39;测试,需要在之前配置进行初始化。

所以我可以将setup_runtime_environment方法添加到每个块之前的末尾。但更理想的是在规范运行之前立即运行该方法。 A&#39; just_before&#39;块。有谁知道这样做的方法?

澄清:

如果我正在运行一个&#39;整体&#39; spec - 只从Class A继承的一个,堆栈看起来像这样,假设&#39; A&#39;是Class A中的前一个块和&#39; s&#39;是setup_runtime_environment

A -> s -> running of specs

同样,如果我正在运行一个特定的规范 - 一个继承自Class C的规范,那么堆栈看起来应该是这样的:

A -> s -> B -> C -> running of specs

我想要&#39;在任何一个链的最后调用:

A -> s -> running of specs  

A -> B -> s -> running of specs  

A -> B -> C -> s -> running of specs  

这就是我所说的&#39;就在&#39;之前 - 就像规格运行之前一样。

1 个答案:

答案 0 :(得分:1)

由于规范DSL的行为,您受到限制。如果您想真正控制设置代码与继承设置一起运行的时间,则应使用测试样式setupsuper

Class A < Minitest::Spec

  def setup
    # do stuff
    setup_runtime_environment
  end

end

Class B < Class A

  def setup
    super
    # do stuff after setup_runtime_environment
  end

end

Class C < Class B

  def setup
    # do stuff before setup_runtime_environment
    super
  end

end