Hoje comecei meu primeiro projeto Rails onde vou usar o MiniTest como framework de testes. Eu procuro a sintaxe específica, então me pergunto como tornar meu teste super sexy. E esta é a solução:
module SubjectMatchers
extend ActiveSupport::Concern
included do
alias_method :context, :describe
end
MiniTest::Expectations.methods.grep(/^(must|wont)_/).each do |m|
define_method m do |*args, &block|
subject.send(m, *args, &block)
end
end
def pending
skip('Not yet implemented...')
end
module ClassMethods
def subject(name = nil, &block)
if name
let(name, &block)
let(:subject) { send(name) }
else
let(:subject, &block)
end
end
def its(name, &block)
it { subject.send(name).instance_eval(&block) }
end
def pending
it { skip('Not yet implemented...') }
end
end
end
ActiveSupport::TestCase.send :include, SubjectMatchers
Alguns dos recursos:
- Não mais
subject.must_blabla
! A partir de agora, posso escrever de forma simplesmust_blabla
e isso será aplicadosubject
por padrão. - Você deseja verificar rapidamente se, ou seja, o modelo é válido? Em vez disso,
it { subject.valid?.must_equal true
useits(:valid?) { must_equal true }
. Legal, não é? Quantas vezes você já escreveu algo assim? (o que é uma boa prática)
let(:foo) { Foo.new }
subject { foo }Eu tive muito isso no RSpec. Então aqui temos
subject(:foo) { Foo.new }
. Mate dois coelhos com uma cajadada só e pronto.Bem-vindo de volta, bom velho
pending
.
Espero que este snippet seja útil para você também.