Es en gran medida una cuestión de gustos, y la mayoría de las herramientas de prueba merecen su apoyo a ambos. Mi preferencia personal es para RSpec sobre prueba :: Unidad porque a) la salida y el diseño de las pruebas se centran en lo que se supone que debe hacer el objeto bajo prueba (a diferencia de lo que es el código) yb) diciendo "X debería Y" tiene más sentido para mí que "afirmar que el predicado X es X.
Para brindarle un poco de contexto para los puntos anteriores, aquí tiene una comparación (bastante artificial) del código de salida / fuente de dos pruebas de unidades funcionalmente equivalentes, una escrita con RSpec y la otra con Test :: Unit.
Código en prueba
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
Prueba :: Unidad
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
Prueba :: Unidad de salida (tan completa como podría hacerlo)
Ξ 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.
Salida de RSpec (formateador de documentación)
Ξ 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
P.S. Creo que Berin (respondedor anterior) está combinando los roles de Pepino (que surgió del proyecto RSpec pero es independiente) y RSpec. Cucumber es una herramienta para las pruebas de aceptación automatizadas en un estilo BDD, mientras que RSpec es una biblioteca de códigos para las pruebas que pueden ser, y se utilizan, a nivel de unidad, integración y funcional. Por lo tanto, el uso de RSpec no excluye las pruebas unitarias, es solo que usted llama 'especificaciones' a sus pruebas unitarias.