如何组织minitest / unit测试?

时间:2013-01-10 17:33:15

标签: ruby-on-rails ruby minitest

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

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

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

4 个答案:

答案 0 :(得分:43)

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

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

    test/
         models/
                user/
                     authentication_test.rb
                     email_test.rb
                     reservation_test.rb
                     user_test.rb
                     username_test.rb
    

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

    require "minitest_helper"
    
    describe User, :authentications do
    
      before do
        # ...
    

答案 1 :(得分:15)

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

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

甚至嵌套测试类:

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

答案 2 :(得分:11)

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

class ConventionalNameTest < ActiveSupport::TestCase
  class ContextTest < ConventionalNameTest
    # so much stuff...
  end
  class AnotherContextTest < ConventionalNameTest
    # and some more...
  end

答案 3 :(得分:1)

要以先前的答案为基础,我更喜欢这个稍微冗长的选项:

OpenGLWidget