20

最近,我读了很多关于 Minitest 的文章。我真的很喜欢超轻量级测试框架的想法。我决定在最近的一个项目中用它替换 rspec 并且没有运气让它全部工作。我的问题是

a)在我的验收/集成测试中获得命名路由(rspec 和 test::unit 似乎自动包含它们,但没有使用 minitest),
b)Rails 中整体缺乏采用让我感到不安(每个人似乎都在使用 rspec虽然它更多地用于宝石/库)。

当 rspec 在测试 rails 应用程序方面占主导地位时,是否值得使用 minitest?

4

5 回答 5

24

我是minitest-rails的作者。从您最初提出这个问题到现在,情况发生了很大变化。我的回答假设您使用的是 minitest-rails。

命名路线

如果您使用的是 minitest-rails,那么(现在)就可以了。您可以使用生成器来创建这些测试,或者自己编写它们。在您的验收/集成测试中,所有命名的路由都可用。

require "minitest_helper"

describe "Homepage Acceptance Test" do
  it "must load successfully" do
    get root_path
    assert_response :success
  end
end

采用

我认为随着我们接近 Rails 4,我们将继续看到对使用 Minitest 和 Rails 的更多关注。

值得?

我认为现在从 Minitest 开始是完全值得的。Minitest 现在正在进行大量活动。它也与最近对快速测试的关注非常吻合。但这实际上取决于您的应用程序和团队动态。

于 2012-07-27T15:56:19.310 回答
21

我最近将一个应用程序从 Rspec 切换到 Minitest,这是非常值得的。测试运行更快,语法鼓励更智能、更精简的代码,不知何故,我现在对套件更有信心(工作中的魔法减少了)。

改进延伸到集成/验收测试,我发现 Minitest with Capybara 比 Cucumber 更具可读性和直接性(并且不那么脆弱)。

下面是一个帮助文件,它应该是您使用规范语法使用 Minitest 运行单元、功能和集成测试所需的全部内容。这是基于@tenderlove 的要点和大量阅读/实验。注释和注意事项如下。

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)

require 'rubygems'
gem 'minitest'
require 'minitest/autorun'
require 'action_controller/test_case'

require 'miniskirt'
require 'capybara/rails'
require 'mocha'
require 'turn'

# Support files
Dir["#{File.expand_path(File.dirname(__FILE__))}/support/*.rb"].each do |file|
  require file
end


class MiniTest::Spec
  include ActiveSupport::Testing::SetupAndTeardown

  alias :method_name :__name__ if defined? :__name__
end


class ControllerSpec < MiniTest::Spec
  include Rails.application.routes.url_helpers
  include ActionController::TestCase::Behavior

  before do
    @routes = Rails.application.routes
  end
end

# Test subjects ending with 'Controller' are treated as functional tests
#   e.g. describe TestController do ...
MiniTest::Spec.register_spec_type( /Controller$/, ControllerSpec )


class AcceptanceSpec < MiniTest::Spec
  include Rails.application.routes.url_helpers
  include Capybara::DSL

  before do
    @routes = Rails.application.routes
  end
end

# Test subjects ending with 'Integration' are treated as acceptance/integration tests
#   e.g. describe 'Test system Integration' do ...
MiniTest::Spec.register_spec_type( /Integration$/, AcceptanceSpec )


Turn.config do |c|
  # use one of output formats:
  # :outline  - turn's original case/test outline mode [default]
  # :progress - indicates progress with progress bar
  # :dotted   - test/unit's traditional dot-progress mode
  # :pretty   - new pretty reporter
  # :marshal  - dump output as YAML (normal run mode only)
  # :cue      - interactive testing
  c.format  = :cue
  # turn on invoke/execute tracing, enable full backtrace
  c.trace   = true
  # use humanized test names (works only with :outline format)
  c.natural = true
end

笔记

  • 适用于 Rails 3.1 或 3.2。下面没试过。
  • gem 'minitest'let获得一些更高级的 Minitest 功能(块等)是必要的
  • 这使用了 mocha (fuller mocks/stubs)、miniskirt (factory_girl lite) 和新的 turn runner。这些都不是依赖项。
  • 从 Rails 3.2 开始,describe控制器测试中的嵌套块会引发错误
于 2012-02-10T01:44:12.720 回答
4

前几天我做了一些工作,使使用 minitest 测试 Rails 变得更加简单。请查看http://rawonrails.blogspot.com/2012/01/better-way-of-testing-rails-application.html以了解更多信息。

于 2012-01-12T01:38:30.207 回答
3

minitest -rails gem 让这一切变得简单。

于 2012-07-21T03:29:44.513 回答
1

编码 Ningja 的“MiniTest::Spec setup with Capybara in Rails 3.1”对 Minitest 与 Rails 的集成有很大帮助。

http://code-ningja.posterous.com/73460416

于 2011-10-17T01:29:42.277 回答