Eu tenho controlador:
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
Como testar o método privado current_account
com rspec?
PS Eu uso Rspec2 e Ruby on Rails 3
ruby-on-rails
rspec
petRUShka
fonte
fonte
Respostas:
Use #instance_eval
fonte
Eu uso o método send. Por exemplo:
Porque "send" pode chamar métodos privados
fonte
.send
?Onde o método current_account está sendo usado? Que finalidade serve?
Geralmente, você não testa métodos particulares, mas testa os métodos que chamam o particular.
fonte
Você não deveria testar seus métodos particulares diretamente, eles podem e devem ser testados indiretamente, exercitando o código de métodos públicos.
Isso permite que você altere as partes internas do seu código no futuro sem precisar alterar seus testes.
fonte
Você pode tornar seus métodos privados ou protegidos públicos:
Basta colocar esse código na sua classe de teste, substituindo o nome da sua classe. Inclua o espaço para nome, se aplicável.
fonte
fonte
Os métodos particulares de teste de unidade parecem muito fora de contexto com o comportamento do aplicativo.
Você está escrevendo seu código de chamada primeiro? Este código não é chamado no seu exemplo.
O comportamento é: você deseja que um objeto seja carregado de outro objeto.
Por que você deseja gravar o teste fora do contexto a partir do comportamento que você deveria estar tentando descrever?
Esse código é usado em muitos lugares? Precisa de uma abordagem mais genérica?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller
fonte
Use a gema rspec-context-private para tornar temporariamente públicos métodos públicos em um contexto.
Ele funciona adicionando um contexto compartilhado ao seu projeto.
Então, se você passar
:private
como metadados para umdescribe
bloco, os métodos privados serão públicos nesse contexto.fonte
Se você precisar testar uma função privada, crie um método público que chame a função privada.
fonte
Eu sei que isso é meio hacky, mas funciona se você quiser os métodos testáveis pelo rspec, mas não visíveis no prod.
Agora, quando você pode executar, está assim:
fonte