Visto que tenho uma Personable
preocupação em minha aplicação Rails 4 que tem um full_name
método, como eu faria para testar isso usando RSpec?
preocupações / personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
ruby-on-rails
testing
rspec
Kyle Decot
fonte
fonte
ActiveSupport::Concern
foi retirado do Rails? Achei que já tivesse ido há pouco.Respostas:
O método que você encontrou certamente funcionará para testar um pouco de funcionalidade, mas parece muito frágil - sua classe fictícia (na verdade, apenas a
Struct
em sua solução) pode ou não se comportar como uma classe real queinclude
é a sua preocupação. Além disso, se você estiver tentando testar as preocupações do modelo, não será capaz de fazer coisas como testar a validade de objetos ou invocar retornos de chamada ActiveRecord a menos que configure o banco de dados de acordo (porque sua classe fictícia não terá um suporte de tabela de banco de dados isto). Além disso, você desejará não apenas testar a preocupação, mas também testar o comportamento da preocupação dentro das especificações do seu modelo.Então, por que não matar dois coelhos com uma cajadada só? Usando os grupos de exemplos compartilhados do RSpec , você pode testar suas preocupações em relação às classes reais que os usam (por exemplo, modelos) e poderá testá-los em todos os lugares em que são usados. E você só precisa escrever os testes uma vez e depois incluí-los em qualquer especificação de modelo que use sua preocupação. No seu caso, pode ser algo assim:
As vantagens dessa abordagem se tornam ainda mais óbvias quando você começa a fazer coisas em sua preocupação, como invocar callbacks de AR, onde qualquer coisa menos do que um objeto AR simplesmente não funcionará.
fonte
parallel_tests
. Acho que será melhor ter testes separados em vez de usarshared_examples_for
eit_behaves_like
.parallel_tests
são baseados em arquivo, portanto, exemplos compartilhados não devem retardá-lo. Eu também argumentaria que comportamentos compartilhados adequadamente agrupados superam a velocidade do teste.concerns
diretório em seuspec_helper.rb
github.com/rspec/rspec-core/issues/407#issuecomment-1409871_spec
ao nome do arquivo que contém shared_examples_for (personable_spec.rb neste caso), caso contrário, você receberá uma mensagem de aviso enganosa - github.com/rspec/rspec-core/issues/828 .Em resposta aos comentários que recebi, eis o que acabei fazendo (se alguém tiver melhorias, sinta-se à vontade para publicá-las) :
especificações / preocupações / personable_spec.rb
fonte
Person
. Vou editar para corrigir.undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
Outra idéia é usar a gem with_model para testar coisas como essa. Eu estava procurando testar uma preocupação e vi a gema pg_search fazendo isso . Parece muito melhor do que testar em modelos individuais, uma vez que eles podem mudar, e é bom definir o que você vai precisar em sua especificação.
fonte