如何组织minitest/unit测试?

doj*_*sto 49 ruby ruby-on-rails minitest

在为几个项目使用RSpec之后,我给了minitest/unit.到目前为止我喜欢它,但我错过了使用describe/context块以逻辑方式对我的测试/规范进行分组.

我知道minitest/spec提供了这个功能,但我喜欢minitest/unit感觉更接近于准系统Ruby.

是否有任何宝石为minitest/unit提供描述/上下文支持?或者,我应该只使用minitest/unit中长而无组织的测试文件?

blo*_*age 47

我知道来自RSpec的几个人最小的努力解决同样的问题.他们喜欢使用describe/context块嵌套的能力,并希望继续使用minitest.有几种解决方案:

  1. 使用minitest的规范DSL:虽然存在细微差别,但规范DSL为您提供了大部分(全部?)rspec DSL的优秀部分.最大的区别是缺乏context积木.但是你可以轻松地使用describe它,一切都按照你的预期运作.
  2. 使用目录和文件:我更喜欢这个选项.我不喜欢滚动300行测试文件,无论它是使用规范DSL还是经典xUnit样式.我发现嵌套无关的测试很有帮助.对代码理解的相同规则适用于测试.所以打破它.创建一个目录并在其中放置几个​​文件.

以下是我的测试文件的组织方式示例:

test/
     models/
            user/
                 authentication_test.rb
                 email_test.rb
                 reservation_test.rb
                 user_test.rb
                 username_test.rb
Run Code Online (Sandbox Code Playgroud)

无论我使用spec DSL还是xUnit样式,我都使用这种结构.当使用规范DSL时,我在我的描述块中指定我正在测试的内容,如下所示:

require "minitest_helper"

describe User, :authentications do

  before do
    # ...
Run Code Online (Sandbox Code Playgroud)


Woj*_*ski 17

您还可以将多个类放入一个测试文件中:

module PizzaTest
  class Isolation < ActiveSupport::TestCase
    test "is awesome by default" do
      assert Pizza.new.awesome?
    end
  end

  class Integration < ActiveSupport::TestCase
    fixtures :all

    test "is awesome too" do
      pizzas('one-with-everything').awesome?
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

甚至嵌套测试类:

class PizzaTest < ActiveSupport::TestCase
  test "is awesome by default" do
    assert Pizza.new.awesome?
  end

  class Integration < ActiveSupport::TestCase
    fixtures :all

    test "is awesome too" do
      assert pizzas('one-with-everything').awesome?
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


kan*_*kyu 13

我更喜欢这种方式(只是一点点)但我认为更容易遵循:

class ConventionalNameTest < ActiveSupport::TestCase
  class ContextTest < ConventionalNameTest
    # so much stuff...
  end
  class AnotherContextTest < ConventionalNameTest
    # and some more...
  end
Run Code Online (Sandbox Code Playgroud)

  • 这是我尝试的方法。我发现的问题是Minitest最终在每个嵌套类上运行了从ConventionalNameTest继承的所有测试用例。 (3认同)
  • @RafałCieślak 只是不在父类中定义测试,而仅在子类中定义测试。父类只能有`setup`/`teardown`。 (3认同)
  • 能够在一个测试文件中多次定义“setup”,并且不超出 DSL 规范 (2认同)