É em grande parte uma questão de gosto, e a maioria das ferramentas de teste vale o apoio de ambos. Minha preferência pessoal é por RSpec sobre Test :: Unit porque a) a saída e o layout dos testes se concentram no que o objeto em teste deve fazer (em oposição ao código) eb) dizendo 'X deve Y' faz mais sentido para mim do que "afirmar que X predica Y".
Para fornecer um contexto para os pontos acima, aqui está uma comparação (bastante artificial) do código de saída / fonte de dois testes de unidade equivalentes em termos funcionais, um escrito usando o RSpec e o outro usando Test :: Unit.
Código em teste
class DeadError < StandardError; end
class Dog
def bark
raise DeadError.new "Can't bark when dead" if @dead
"woof"
end
def die
@dead = true
end
end
Teste :: Unidade
require 'test/unit'
require 'dog'
class DogTest < Test::Unit::TestCase
def setup
@dog = Dog.new
end
def test_barks
assert_equal "woof", @dog.bark
end
def test_doesnt_bark_when_dead
@dog.die
assert_raises DeadError do
@dog.bark
end
end
end
RSpec
require 'rspec'
require 'dog'
describe Dog do
before(:all) do
@dog = Dog.new
end
context "when alive" do
it "barks" do
@dog.bark.should == "woof"
end
end
context "when dead" do
before do
@dog.die
end
it "raises an error when asked to bark" do
lambda { @dog.bark }.should raise_error(DeadError)
end
end
end
Teste: Saída da unidade (o mais cheio possível)
Ξ code/examples → ruby dog_test.rb --verbose
Loaded suite dog_test
Started
test_barks(DogTest): .
test_doesnt_bark_when_dead(DogTest): .
Finished in 0.004937 seconds.
Saída RSpec (formatador de documentação)
Ξ code/examples → rspec -fd dog_spec.rb
Dog
when alive
barks
when dead
raises an error when asked to bark
Finished in 0.00224 seconds
2 examples, 0 failures
2 tests, 2 assertions, 0 failures, 0 errors
PS: Eu acho que Berin (respondedor anterior) está confundindo os papéis de Pepino (que surgiu do projeto RSpec, mas é independente) e RSpec. O pepino é uma ferramenta para testes de aceitação automatizados no estilo BDD, enquanto o RSpec é uma biblioteca de códigos para testes que podem ser e são usados nos níveis de unidade, integração e funcionalidade. Portanto, o uso do RSpec não exclui o teste de unidade - basta chamar as especificações de teste de unidade.