Rails TDD: crie um método de classe de modelo antes de exigir

Digamos que você tenha o seguinte:

# app/models/user.rb
class User < ActiveRecord::Base
authenticates_with_sorcery
!
end

Se quiser testar este modelo sem carregar o ambiente Rails e não precisar testar authenticates_with_sorcery!, você pode usar o seguinte:

def stub_ar_class_method(class_name, method_name)
begin
klass
= Module.const_get(class_name)
rescue NameError
klass
= Class.new(ActiveRecord::Base)
Object.const_set class_name, klass
end

unless klass.methods.include?(method_name)
klass
.send :define_singleton_method, method_name, lambda {|*|}
end
end

Então, em suas especificações, você pode criar métodos de stub antes de exigir a classe:

# user_spec.rb
stub_ar_class_method
:User, authenticates_with_sorcery!
require '/path/to/app/models/user.rb'

# Begin test suites...

Por que isso é útil? Principalmente porque mantém seus testes básicos rápidos:

  • Você não tem que carregar o ambiente Rails
  • Você não precisa carregar nenhuma outra biblioteca desnecessária
  • Você pode facilmente criar stub métodos de classe dentro de um corpo de método auxiliar