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

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

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.


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!


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.


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


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

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

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.

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.


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.


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

4

specky.vim


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.


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.


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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.