Почему MiniTest намного лучше, чем RSpec
Простота
Когда я начал программировать профессионально, я писал на Python, и я всегда завидовал среде тестирования Ruby RSpec, когда смотрел видео RubyConf/RailsConf, но в то время я писал тесты, как показано ниже.
def test_that_it_returns_a_list_of_authors():
authors = get_authors_with_names_that_start_with('M')
assert isinstance(authors, list)
def test_that_it_returns_a_list_of_books():
books = search_for_books_by_author('Damian Marrett')
assert isinstance(books, list)
def test_that_it_returns_an_html_element():
URL = '
response = requests.get(URL)
assert isinstance(create_html_element_from(response), HtmlElement)
Как видите, я не знал, что такое тестирование, и в тот момент я был просто в восторге от тестирования. После того, как в последние годы я перешел на Ruby и Ruby On Rails и начал писать спецификации и тесты для приложений, я понял, что существует большая разница между MiniTest и RSpec. какая-то сумасшедшая магия метапрограммирования под капотом.
Кривая обучения
Просто выучить Руби? Хорошо, не нужно изучать новый фреймворк, это просто синтаксис Ruby + новые методы, и на самом деле это одна из причин, по которой Google изобрел простой и глупый язык под названием Golang вместо волшебного, чтобы помешать разработчикам творить чудеса и просто добавлять функции вместо того, чтобы играть с ними. DSL.
RSpec.describe Foo, type: :model do
include_context 'sync something'
describe 'associations' do
it { is_expected.to belong_to(:bar) }
it { is_expected.to belong_to(:baz).optional }
it { is_expected.to belong_to(:user).optional }
it { is_expected.to belong_to(:category).class_name('Something').optional }
end
end
Что такое include_context
? Что такое is_expected
? Как я могу идентифицировать SUT (тестируемую систему), если я ее не вижу? Почему я должен заботиться о внутренних объектах, таких как имя класса class_name
?
class FooTest < MiniTest::Test
def setup
@foo = Foo.new
@foo.sync_with_api
end
def test_should_belong_to_bar
assert @foo.bar.present?
end
def test_should_belong_to_baz
assert @foo.baz.present?
end
def test_should_belong_to_baz
assert @foo.baz.present?
end
def test_should_belong_to_category
assert @foo.categories.present?
end
end
Хм? загрузка простого объекта, синхронизация с некоторым API и проверка наличия каких-либо ассоциаций имеют смысл.
Не нужно устанавливать границы для ваших тестов, потому что ваши коллажи не могут пойти не так с MiniTest или использовать нестандартный способ написания тестов, ПРОСТО ПРОСТОЙ РУБИН.
Надеюсь, вам понравится 🍕