Bloques: Permiten ejecutar un bloque antes o despues de correr los test:
setup: se ejecuta el bloque antes de tus specs.
class UserTest < ActiveSupport::TestCase
def setup
@user = User.new
end
[...]
end
teardown: se ejecuta el bloque después de tus specs.
class UserTest < ActiveSupport::TestCase
def teardown
@user.points = @user.points + 10
@user.save
end
[...]
end
Mockup: Es probable que haya que recurrir a ciertos recursos donde en nuestro entorno de pruebas no se encuentren disponibles o con la información deseada, por ejemplo, llamadas a APIs externas, servicios de Oauth, etc. Para corregir este problema, sobreescribiremos dichos recursos para que en vez de ejecutar su código nos devuelvan los valores que esperamos.
def setup
ApplicationController.stubs(:current_user).returns(build(:current_user))
end
def setup
stub_request(:any, "www.example.com").to_return(body: "foo", status: 200)
end
Para esto se puede utilizar la gema webmock o VCR
Un test unitario comprueba una funcionalidad concreta, por ejemplo, de un metodo de una clase en concreto.
class UserTest < ActiveSupport::TestCase
def setup
@user = User.new(name: 'user', email: 'user@mail.com')
end
test 'valid user' do
assert @user.valid?
end
end
Un test funcional es algo más complejo y se ve implicada con la interacción de otras clases o modulos.
class UserTest < ActiveSupport::TestCase
test "#total_price" do
products = ProductsService.run
shopping_cart = ShoppingCart.new(products)
assert_equal 50, shopping_cart.total_price
end
end
Una buena practica y recomendada a la hora de testear modelos sería testear relaciones, validaciones y los metodos del modelo correspondiente.
class UserTest < ActiveSupport::TestCase
test 'valid user' do
user = User.new(name: 'user', email: 'user@example.com')
assert user.valid?
end
test 'invalid without name' do
user = User.new(email: 'user@example.com')
refute user.valid?
assert_not_nil user.errors[:name]
end
test 'invalid without email' do
user = User.new(name: 'user')
refute user.valid?
assert_not_nil user.errors[:email]
end
end
class ReporterControllerTest < ActionController::TestCase
def test_show
get :show
assert_response 200
end
end