Faça sua especificação MiniTest sexy como fu **

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 simples must_blablae isso será aplicado subjectpor padrão.
  • Você deseja verificar rapidamente se, ou seja, o modelo é válido? Em vez disso, it { subject.valid?.must_equal trueuse its(: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.