Многие Rails разработчики уже используют shoulda - замечтельный BDD фреймворк от команды thoughtbot, как альтернативу rspec, например.
Сам фреймворк - это надстройка над UnitTests.
При разработке с UnitTests часто возникает необходимость запустить отдельный тест и посмотреть результаты. Но как быть с shoulda - ведь названия тестов здесь это обычные текстовые предложения, которые формируются с учетом контекста теста и контекстов в котором тест находится. Например:
require File.dirname(__FILE__) + '/../test_helper'
require 'shoulda'
class ArticleTest < Test::Unit::TestCase
fixtures :all
context "On create" do
should "create article if all params ok" do
article = Article.new( :title => "shoulda rocks", :body => "Try it")
end
should "require title" do
article = Article.new(:body => "That article wouldn't be published")
end
should "require body" do
article = Article.new(:title => "Where is my body?")
end
end
end
В таком случае shoulda сгенерит следующие тесты:
test: On create should create article if all params ok
test: On create should require title
test: On create should require body
Пока у нас не много тестов все ок. Но если у нас большое количество контекстов, например, On Create, On Update, On Destroy и т.д.? И мы хотим выполнить определенный контекст для того чтобы понять где именно проблема.
Для этого воспользуемся возможностью UnitTests запускать отдельные тесты с ключем -n
Test::Unit automatic runner.
Usage: test/unit/shop_test.rb [options] [-- untouched arguments]
-r, --runner=RUNNER Use the given RUNNER
(c[onsole], f[ox], g[tk], g[tk]2, t[k])
-n, --name=NAME Runs tests matching NAME.
(patterns may be used).
-t, --testcase=TESTCASE Runs tests in TestCases matching
TESTCASE. (patterns may be used).
-I, --load-path=DIR[:DIR...] Appends directory list to $LOAD_PATH.
-v, --verbose=[LEVEL] Set the output level (default
is verbose). (s[ilent],
p[rogress], n[ormal],v[erbose])
-- Stop processing options so that the
remaining options will be passed to the
test.
-h, --help Display this help.
Deprecated options:
--console Console runner (use --runner).
--gtk GTK runner (use --runner).
--fox Fox runner (use --runner).
Как показывает нам справка, параметром ключа -n может быть любое регулярное выражение. Например, команда:
ruby test/unit/article_test.rb --name="/test:(.*)On create(.*)/"
запустит на выполнение только тесты из контекста On create.
Вот так вот.