Pensar en una caja negra porque "no sabemos" el código que está por detrás para dar solución al problema
No olvidar qué las pruebas tenemos que tener claro las ENTRADAS y SALIDAS. Lo que se pruebas son las SALIDAS
Existen 3 pasos comunes para construir pruebas y es la AAA
-
Arrange | Arreglar | Preparar
-
Act | Actuar | Ejecutar
-
Assert | Afirmar | Validar
-
Arrange. Preparar los datos de entrada que necesito
-
Act. Ejecutar la acción que estoy probando
-
Assert. Validar salida de la acción realizada
Es la que normalmente programamos, son baratas, cortas y no prueban dependencias externas
Pruebas con dependencias externas como BD, envío de correos, carga de imágenes, etc.
Pruebas de UI y flujos del software. Una herramienta utilizada es Capibara
Probar solo métodos públicos y flujos
group :development, :test do
gem 'rspec-rails', '~> 5.0.0'
end
bundle
rails g rspec:install
Rspec.describe MiClase do # Comportamiento de clase
end
Rspec.describe MiClase do
describe '#metodo' do
end
describe '#metodo2' do
end
end
Bloque context
hace lo mismo que el describe anidado, solo que ayuda a tener un lenguaje más "humano"
Rspec.describe MiClase do
context 'cuando tenemos una condición' do
end
end
Bloque it
es el bloque de prueba concreta que recibe una descripción de la prueba y dentro va la AAA
Rspec.describe MiClase do
describe '#metodo1' do
it 'descripción de la prueba' do
end
end
end
Métodos helper que se ejecutan cuando son llamados
Rspec.describe MiClase do
let(:metodo_ayudante) do
# codigo
end
let(:metodo_ayudante_una_linea) { #codigo }
end
- Se utiliza el método `expect()` para saber qué se va a evaluar y tiene que ser igual o diferente a un `matcher`
```ruby
expect(actual).to matcher(expected)
expect(actual).not_to matcher(expected)
expect(actual).to_not matcher(expected) # es lo mismo que arriba
```
[Lista de Matchers básicos](https://relishapp.com/rspec/rspec-expectations/v/3-10/docs/built-in-matchers)
```ruby
require 'rails_helper'
RSpec.describe Product, type: :model do
it 'should validate presence of attributes' do
product = Product.new
product.save
expect(product).to_not be_persisted
end
it 'should validate uniqueness name' do
product1 = Product.new(name: 'jueguete')
product1.save
product2 = Product.new(name: 'jueguete')
product2.save
expect(product2).to_not be_valid
end
end
```
Deberíamos recordar qué vamos a probar que son peticiones HTTP entrantes y salidas en vistas, normalmente HTML Son conocidos como pruebas funcionales En Rspec son
rspec:controller
orspec:request
Deberíamos tomar en cuenta para probar lo siguiente
- ¿La petición fue exitosa?
- ¿El usuario es redirigido a la página correcta?
- ¿El usuario fue autenticado correctamente?
- ¿El mensaje adecuado se mostró al usuario?
- ¿Se mostró la vista adecuada en la respuesta?
Se puede probar lo siguiente:
- rendered templates
- redirects
- instance variables assigned in the controller to be shared with the view
- cookies sent back with the response
require 'rails_helper'
RSpec.describe "/products", type: :request do
describe "GET /index" do
it 'should return index template' do
get products_path
#puts response.methods.sort
expect(response).to have_http_status(200)
expect(response).to be_successful
end
end
describe "POST /products" do
it 'should redirect to products_path' do
post products_path, params: { product: { name: 'jueguete' } }
expect(response).to be_redirect
end
end
end
Tomar en cuenta para las vistas que se deben seguir la siguiente estructura
assign(:widget, Widget.new) # sets @widget = Widget.new in the view template render expect(rendered).to match(/text/)
Tomar como ejemplo lo siguiente:
require "rails_helper"
RSpec.describe ProductsController, type: :routing do
describe "routing" do
it "routes to #index" do
expect(get: "/products").to route_to("products#index")
end
it "routes to #new" do
expect(get: "/products/new").to route_to("products#new")
end
it "routes to #show" do
expect(get: "/products/1").to route_to("products#show", id: "1")
end
it "routes to #edit" do
expect(get: "/products/1/edit").to route_to("products#edit", id: "1")
end
it "routes to #create" do
expect(post: "/products").to route_to("products#create")
end
it "routes to #update via PUT" do
expect(put: "/products/1").to route_to("products#update", id: "1")
end
it "routes to #update via PATCH" do
expect(patch: "/products/1").to route_to("products#update", id: "1")
end
it "routes to #destroy" do
expect(delete: "/products/1").to route_to("products#destroy", id: "1")
end
end
end