Faça seus códigos RSpec MEIO. Introdução de RSpecZ estendendo RSpec para revisores e desenvolvedores.

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, contexte subjectagora.
Quero RSpecZ ser um Guia de RSpec no futuro por isso vou fazer generators, code analyzer and formattere algo parecido.

Eu mostro a eficácia do RSpecZ com imagem.

rspecz_image.png

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 contextmé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 contexte letmostra a mesma coisa.

Mas isso acontecerá muito frequentemente quando usarmos o RSpec.

E mais um problema.
RSpec’s contextnão tem significado por si só. contexto 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_numbervariá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_validmétodo combinar contexte let.
E o nome do método pode dizer que o validvalor será colocado phone_number.

O revisor pode saber que as validespecificaçõ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_validmas também set_invalidpara o caso de invalidconjunto 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 letpode 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_paramsmé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_paramsdefinir params letcom o uso de lets definidos .

Na verdade, create_paramsdefina letcom 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 letmé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_spece supportarquivos.
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.