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