Página Inicial > Ruby > Porque não gosto de usar “should” nos testes de RSpec

Porque não gosto de usar “should” nos testes de RSpec

Desde que li o post RSpec Best Practices de Jared Carroll (post o qual David Chelimsky prefere citar como Good Guidelines) eu prefiro não mais utilizar o termo should para todos os exemplos (testes) de RSpec.

Primeiro que concordo com Jared sobre a redundância da palavra should e como o resultado dos testes ficam mais claros quando rodamos no formato de documentação.

Abaixo dois exemplos (extraídos do post de Jared).

O primeiro usa should:

$ rspec spec/controllers/posts_controller_spec.rb --format documentation

PostsController
  #new
    when not logged in
      should redirect to the sign in page
      should display a message to sign in

Agora eliminando o should e usando o verbo na terceira pessoa:

$ rspec spec/controllers/posts_controller_spec.rb --format documentation

PostsController
  #new
    when not logged in
      redirects to the sign in page
      displays a message to sign in

A segunda razão é a questão gramatical e do sentido dos testes.

O verbo modal should, entre outros significados, pode ser considerado uma obrigação, mas é uma obrigação gentil, cuidadosa, sem muita firmeza.

When not logged in, should redirect to the sign in page.
Quando não logado, deveria redirecionar para a página de login.

Deveria ou deve? Para o teste passar tem que redirecionar para a página de login. Se não redirecionar, o teste falhará. Nessa caso, gramaticalmente, não é melhor usar o verbo modal must, que expressa uma obrigação impreterível?

Então, para ficar simples, uso o verbo na terceira pessoa, evito verbos modais repetitivos e deixo explícito o que o teste está assegurando.

When not logged in, redirects to the sign in page.
Quando não logado, redireciona para a tela de login.


Ruby , ,

  1. 23, outubro, 2011 em 19:52 | #1

    Boa!

    Outra referência sobre essa “obrigação gentil” é o uso do SHOULD em RFCs, onde ele representa uma recomendação:

    3. SHOULD This word, or the adjective “RECOMMENDED”, mean that there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course.

    Já o MUST:

    1. MUST This word, or the terms “REQUIRED” or “SHALL”, mean that the definition is an absolute requirement of the specification.

  2. 23, outubro, 2011 em 20:17 | #2

    Eu era fã do should também e depois de um bom tempo, disincanei e passou a fazer mais sentido não usá-lo.

    Outra coisa interessante, é que o padrão definido pelo rspec em seu próprio site, é não usar mais o should e manter em terceira pessoa.

  3. 23, outubro, 2011 em 20:30 | #3

    Boa! Concordo!

  1. Nenhum trackback ainda.