Falei no Omotesando.rb (Ruby Meetup no Japão) outro dia.
Surpreendentemente, Matz compareceu a esse encontro.
Lá, Matz deu um comentário para RSpecZ, uma gema para RSpec.
“Você deve fazer uma solicitação de pull no repositório RSpec.”
Eu não fiz a solicitação de pull ainda.
Mas eu percebi que muitas pessoas estão interessadas em RSpecZ.
Portanto, apresento o RSpecZ aqui primeiro.
O que é RSpecZ?
RSpec tem um grande problema.
Os códigos RSpec são longos (significa difícil de revisar).
RSpecZ está tentando resolver este problema.
Possui métodos de extensão let
, context
e subject
agora.
Quero RSpecZ ser um Guia de RSpec no futuro por isso vou fazer generators
, code analyzer and formatter
e algo parecido.
Eu mostro a eficácia do RSpecZ com imagem.
Esta imagem foi criada aplicando RSpecZ a um código rspec de um projeto do qual participei.
Eu vou te dizer como isso pode acontecer.
Recursos básicos
Amplie o contexto
O context
método RSpec é flexível e versátil.
Em outras palavras, tende a ser redundante e difícil de entender.
Por exemplo,
context 'When phone_number is 090-1234-5678' do
let(:phone_number) { '090-1234-5678' }
it { expect(phone.save).to be_truthy }
end
( 090-1234-5678
é um número de telefone válido no Japão).
Isso context
é redundante. Porque context
e let
mostra a mesma coisa.
Mas isso acontecerá muito frequentemente quando usarmos o RSpec.
E mais um problema.
RSpec’s context
não tem significado por si só. context
o primeiro argumento mostra o estado do contexto.
Sem o primeiro argumento, não podemos saber que tipo de contexto ele cria.
O código acima significa que definir um número de telefone válido para phone_number
variável (let).
RSpecZ torna este código simples.
set_valid(:phone_number, '090-1234-5678') do
it { expect(phone.save).to be_truthy }
end
set_valid
método combinar context
e let
.
E o nome do método pode dizer que o valid
valor será colocado phone_number
.
O revisor pode saber que as valid
especificações serão escritas no bloco quando ele ler o nome do método.
E as linhas de código ficam curtas.
Com RSpecZ você pode escrever vários casos válidos com muita facilidade.
set_valids(:phone_number, '090-1234-5678', '080-9566-8466', '070-4567-8901', '09045678945' ) do
it { expect(phone.save).to be_truthy }
end
O mesmo código com RSpec será
%w[090-1234-5678 080-9566-8466 070-4567-8901 09045678945].each do |phone_number|
context "When phone_number is #{phone_number}" do
let(:phone_number) { phone_number }
it { expect(phone.save).to be_truthy }
end
end
Você pode saber como é fácil revisar os códigos RSpecZ comparando-os.
RSpecZ não só, set_valid
mas também set_invalid
para o caso de invalid
conjunto de valores.
Escolha o método correto para ajudar o revisor a revisar os códigos.
Estender let
Quando você escreve RSpec, você pode escrever este tipo de código,
let(:name) { 'test-name' }
let(:phone_number) { '090-1234-5678' }
let(:address) { 'test-address' }
let(:params) { {
name: name,
phone_number: phone_number,
address: address
} }
subject { get '/api/test', params: params }
Isso let
pode ajudá-lo a alterar uma parte do contexto do valor padrão.
Você pode escrever especificações flexíveis.
No entanto, esses códigos também são redundantes.
RSpecZ tem create_params
método.
let(:name) { 'test-name' }
let(:phone_number) { '090-1234-5678' }
let(:address) { 'test-address' }
create_params :name, :phone_number, :address
subject { get '/api/test', params: params }
Este código tem o mesmo significado. create_params
definir params
let
com o uso de let
s definidos .
Na verdade, create_params
defina let
com caracteres se o parâmetro ainda não foi definido. Portanto, o código abaixo também tem o mesmo significado.test-xxx
let(:phone_number) { '090-1234-5678' }
create_params :name, :phone_number, :address
subject { get '/api/test', params: params }
Implementarei let
métodos mais úteis no futuro.
Outras características
RSpecZ tem alguns outros métodos úteis.
Por favor, verifique o repositório github se você estiver interessado.
https://github.com/RSpecZ/RSpecZ
Eficácia da medição de RSpecZ
Eu verifico a eficácia do RSpecZ com projetos comparados.
Um é um projeto rails sem RSpecZ (eu participo antes) e o outro é um projeto rails com RSpecZ (eu participo atualmente).
Premissas
- Esses projetos são completamente diferentes. Eles têm lógicas de negócios diferentes.
- Desenvolvi código base de ambos os projetos. (Os estilos de código básicos são os mesmos)
- O projeto com RSpecZ acabou de começar (3 meses), então os códigos são menores.
- Usamos outros recursos no projeto com RSpecZ que o RSpecZ ainda não tem. Portanto, não apenas o recurso RSpecZ torna os códigos mais curtos.
Resultados
|| Linhas de RSpec | Número de testes |
|: -: |: -: |: -: |: -: |
| Projeto com RSpecZ | 2183 | 1223 |
| Projeto sem RSpecZ | 20023 | 5143 |
Linhas de RSpec: Total de linhas request_spec
e support
arquivos.
Número de testes: Número de exemplos.
Conclusão
RSpecZ pode tornar os códigos RSpec MEIOS.
(NÃO PODE comparar apenas recursos RSpecZ por causa das instalações)
Isso pode não ser preciso, mas podemos saber o poder do RSpecZ pelo resultado.
Finalmente
Este artigo apresenta os recursos do RSpecZ.
RSpecZ começou há poucos meses.
Temos muito poucos commiters.
Por favor, dê comentários se você estiver interessado.