在Rails中使用Minitest

Joh*_*ith 20 minitest ruby-on-rails-3

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

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

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

blo*_*age 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
Run Code Online (Sandbox Code Playgroud)

采用

我认为随着我们越来越接近Rails 4,我们将继续关注使用Minitest和Rails.

值得?

我认为现在从Minitest开始是完全值得的.现在Minitest正在进行大规模的活动.它与最近对快速测试的关注很好地吻合.但这实际上取决于您的应用和团队动态.

  • 很酷,很棒.很高兴看到Minitest获得了很多关注,而minitest-rails绝对是现在使用Minitest与Rails一起使用的方式. (2认同)

Set*_*Bro 21

我最近将一个应用程序从Rspec切换到Minitest,这非常值得.测试运行更快,语法鼓励更聪明,更精简的代码,并且我现在对套件更有信心(工作中的魔力更小).

改进扩展到集成/验收测试,我发现Minitest与Capybara比Cucumber更容易阅读和简单(而且更不易碎).

下面是一个帮助文件,应该是使用spec语法运行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
Run Code Online (Sandbox Code Playgroud)

笔记

  • 适用于Rails 3.1或3.2.以下没试过.
  • gem 'minitest'有必要获得更高级的Minitest功能(let块等)
  • 这使用mocha(更丰满的模拟/存根),迷你裙(factory_girl lite)和新的转轮.这些都不是依赖关系.
  • 从Rails 3.2开始,describe控制器测试中的嵌套块会引发错误

  • Ryan Bates最近发布了一个[关于使用Rails的MiniTest的Railscast](http://railscasts.com/episodes/327-minitest-with-rails).它需要订阅,但无疑是值得的. (2认同)
  • 真棒.minitest为+1,迷你裙为+1,转弯为+1.:) (2认同)