62

在为几个项目使用 RSpec 之后,我正在尝试 minitest/unit。到目前为止我很喜欢它,但我想念使用描述/上下文块以合乎逻辑的方式对我的测试/规范进行分组。

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

是否有任何 gem 为 minitest/unit 提供描述/上下文支持?或者,我应该只在 minitest/unit 中处理我冗长的、杂乱无章的测试文件吗?

4

3 回答 3

57

我知道有几个人从 RSpec 来到 minitest 为同一个问题苦苦挣扎。他们喜欢使用描述/上下文块进行嵌套的能力,并希望继续进行 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

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

require "minitest_helper"

describe User, :authentications do

  before do
    # ...
于 2013-01-10T19:24:43.743 回答
24

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

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
于 2013-10-14T15:38:32.547 回答
19

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

class ConventionalNameTest < ActiveSupport::TestCase
  class ContextTest < ConventionalNameTest
    # so much stuff...
  end
  class AnotherContextTest < ConventionalNameTest
    # and some more...
  end
于 2015-04-24T17:34:43.340 回答