Como você executa um único arquivo de teste / especificação no RSpec?

282

Quero poder executar os testes de um único arquivo de especificação - para o arquivo que estou editando, por exemplo. rake specexecuta todas as especificações. Meu projeto não é um projeto Rails, portanto rake spec:docnão funciona.

Não sei se isso importa, mas aqui está minha estrutura de diretórios.

./Rakefile
./lib
./lib/cushion.rb
./lib/cushion
./lib/cushion/doc.rb
./lib/cushion/db.rb
./spec
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb
Jonathan Tran
fonte

Respostas:

392

Ou você pode pular o rake e usar o comando 'rspec':

rspec path/to/spec/file.rb

No seu caso, acho que, desde que o seu arquivo ./spec/db_spec.rb inclua os auxiliares apropriados, ele deverá funcionar bem.

Se você estiver usando uma versão mais antiga do rspec, é:

spec path/to/spec/file.rb
Cameron Booth
fonte
31
com o novo rspec você tem que usar "rspec path / to / file.rb"
djburdick
3
Talvez eu estou fazendo errado, mas eu tenho que fazer "pacote exec rspec path / to / spec / file.rb"
andrhamm
2
Se você estiver usando o Rails, provavelmente precisará executar suas especificações usando o Rake para garantir que você esteja iniciando em um banco de dados em branco.
superluminary
@andrhamm, você está apenas executando suas especificações no contexto do seu pacote. Isso é necessário se você não está usando gemsets (que vêm por padrão com rvm, e são uma extensão separada para rbenv)
Caleb
6
Se você deseja executar apenas um teste, anexe o número da linha do início do teste ao arquivo. Exemplo: caminho rspec / para / spec / file.rb: 455
runamok
201

A invocação bruta:

especificação de rake SPEC = spec / controllers / sessions_controller_spec.rb \
          SPEC_OPTS = "- e \" deve efetuar login com o cookie \ ""

Agora descubra como incorporar isso ao seu editor.

mislav
fonte
1
Como eu disse, não estou nos trilhos, então não há controladores. Mas sim, "rake spec SPEC = file.rb" funciona. Obrigado! Estou trabalhando na integração do Emacs agora.
Jonathan Tran
5
Não inicie o rakefile se puder evitá-lo. Demora muito tempo
Orion Edwards
2
Alterei a resposta aceita, mas o parâmetro SPEC_OPTS também foi útil para mim.
Jonathan Tran
2
Agora é isso que chamo de uma boa resposta. Por que não está marcado como "Resposta"?
Gmile 17/05/10
1
Correndo especificação direta é muitas vezes a melhor escolha, mas há muitos momentos em que você tem que correr ancinho para vários pedaços mágicos em um Rakefile costume
Nerdmaster
124

Esta pergunta é antiga, mas aparece na parte superior do Google ao pesquisar como executar um único teste. Não sei se é uma adição recente, mas para executar um único teste de uma especificação, você pode fazer o seguinte:

rspec path/to/spec:<line number>

where -line number- é um número de linha que contém parte do seu teste. Por exemplo, se você tivesse uma especificação como:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

Digamos que ele esteja salvo em spec / models / foo_spec.rb. Então você executaria:

rspec spec/models/foo_spec.rb:2

e apenas executaria essa especificação. De fato, esse número pode ser de 2 a 5.

Espero que isto ajude!

juanpaco
fonte
Isso é interessante, embora pareça que não funciona depois que você refatorar suas especificações em vários arquivos (ou seja, você só pode usá-las com o arquivo _spec.rb principal, mas se nenhum dos seus exemplos estiver nele, ele não executará nada . Além disso, se você tentar usá-lo para um arquivo que não é um arquivo de especificações de nível superior, que irá também correr nada).
Trejkaz
Eu não entendo direito. O que você quer dizer com "arquivo de especificação de nível superior?" Meu conjunto de testes é praticamente sempre dividido em vários arquivos, e eu sempre posso invocar testes em um único arquivo usando esse método. Você quer dizer ter um arquivo com requireseus outros arquivos de especificação?
juanpaco
Eu posso usar isso em qualquer arquivo em qualquer nível no diretório spec /. Acredito que Trejkaz está incorreto.
precisa
7
isso é incrível e deve estar no topo!
Tommaso Barbugli
4
Eu uso isso o tempo todo, mas às vezes você deseja executar vários testes em um arquivo. Em seguida, você pode digitar todos os exemplos como este:rspec spec/models/foo_spec.rb:2:12:49
swilgosz 30/11
61

Você também pode usar o texto real do caso de teste * e * xample com -e!

Então para:

it "shows the plane arrival time"

você pode usar

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

não há necessidade de ancinho aqui.

tcurdt
fonte
Isso é tudo o que você precisa, exceto que "spec" deve ser substituída por "rspec", conforme declarado @bandhunt
Nicolas Wormser
19

da ajuda (spec -h):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

Exemplo: spec spec / runner_spec.rb -l 162

boblin
fonte
3
Nas versões mais recentes do Rspec, você anexa o número da linha após dois pontos, :conforme a documentação e uma resposta popular.
dragon788
13

Se você instalou o rspec como um plug-in e não como uma jóia, não terá o specexecutável.

De qualquer forma, tudo o que você precisa fazer é executar o arquivo usando ruby. O código rspec é inteligente o suficiente para executar os testes para você.

por exemplo:

ruby myclass_spec.rb
Orion Edwards
fonte
2
É possível executar um teste dentro do arquivo como este?
21813 Ian Vaughan
12

http://github.com/grosser/single_test permite fazer coisas como ..

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last
Zeke
fonte
Parece que a gema não foi mantida, a última confirmação foi há 5 anos!
precisa saber é o seguinte
10

O Ruby 1.9.2 e o Rails 3 têm uma maneira fácil de executar um arquivo de especificação:

  ruby -I spec spec / models / user_spec.rb

Explicação:

  • rubycomando tende a ser mais rápido que o rakecomando
  • -I spec significa "inclua o diretório 'spec' ao procurar arquivos"
  • spec/models/user_spec.rb é o arquivo que queremos executar.
joelparkerhenderson
fonte
Você pode executar um teste nesse arquivo com algumas opções extras?
21813 Ian Vaughan
10

Para executar todos os seus arquivos rspec:rspec

nota: você deve estar na raiz do seu projeto

Para executar um arquivo rspec:rspec 'path_to/spec.rb'

nota: substitua 'path_to / spec.rb' pelo seu caminho. As aspas são opcionais.

Para executar um teste rspec de um arquivo:rspec 'path_to/spec.rb:7'

Nota: 7 é o número da linha onde o teste começa.

nflauria
fonte
5

Eu estava tendo problemas para que algum desses exemplos funcionasse, talvez porque o post seja antigo e os comandos tenham mudado?

Depois de bisbilhotar descobri que funciona:

rspec spec / models / user_spec.rb

Isso executará apenas o arquivo único e fornece saída útil no terminal.

Greg Hemphill
fonte
Isso foi mencionado em um comentário na resposta aceita. Sim, acho que este post é tão antigo que o nome do comando mudou.
Jonathan Tran
3

Como alternativa, dê uma olhada no autoteste.

Executar o autoteste em uma janela de comando significa que o arquivo de especificação será executado sempre que você o salvar. Além disso, ele será executado sempre que o arquivo especificado for executado.

Por exemplo, se você tiver um arquivo de especificação de modelo chamado person_spec.rb e um arquivo de modelo especificado como person.rb, sempre que você salvar um desses arquivos do seu editor, o arquivo de especificação será executado.

fatgeekuk
fonte
3

Embora muitas ótimas respostas tenham sido escritas para essa pergunta, nenhuma delas usa a abordagem Rspectags .

Uso tags para executar uma ou mais especificações em arquivos diferentes - somente aqueles relacionados à minha tarefa de desenvolvimento atual.

Por exemplo, adiciono a tag "dev" com o valor "current":

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

então eu corro

bundle exec rspec . --tag dev:current

Diferentes tags / valores podem ser definidos em especificações ou grupos individuais.

Victor BV
fonte
2

Digamos que você esteja executando o teste para criar tarefas. Você sempre pode executar esse código de especificação de todo específico usando o arquivo crete_spec.rb, conforme abaixo.

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

Se você deseja executar todas as especificações em um único curto.

   rspec 

Se você deseja executar todas as especificações em um controlador específico, use isso.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

Espero que isso lhe dê mais compreensão!

Prabhakar Undurthi
fonte