Estou tentando escrever um teste para um controlador. A ação "criar" espera dados do formulário e rejeita como "entidade não processável" se os dados do formulário não forem validados:
Failure:
ContactsControllerTest#test_should_post_create [test/controllers/contacts_controller_test.rb:36]:
Expected response to be a <3XX: redirect>, but was a <422: Unprocessable Entity>
Estou incluindo modelo, controlador, controlador de teste e acessórios abaixo. A autorização ainda está pronta para uso, mas não deve ser um fator aqui (outros testes funcionam bem).
Suspeito que as chaves estrangeiras nos parâmetros sejam as culpadas aqui, mas não sei como verificar isso. Também tentei @saluation.id e @debitor.id nos parâmetros de teste.
Modelo
class Contact < ApplicationRecord
validates :last_name, presence: true
validates :email, format: {
with: URI::MailTo::EMAIL_REGEXP
}
belongs_to :salutation
belongs_to :debitor
Controlador
class ContactsController < ApplicationController
def create
@contact = Contact.new(contact_params)
@debitors = Debitor.all
@salutations = Salutation.all
if @contact.save
redirect_to contacts_path
else
render :new, status: :unprocessable_entity
end
end
private
def contact_params
params.require(:contact).permit(:last_name, :first_name, :email, :salutation_id, :debitor_id)
end
end
Teste
require "test_helper"
class ContactsControllerTest < ActionDispatch::IntegrationTest
setup do
@user = users(:lazaro_nixon)
@contact = contacts(:one)
@salutation = salutations(:one)
@debitor = debitors(:one)
end
test "should post create" do
sign_in_as @user
post contacts_url, :params => { :contact => { last_name: "Lastname", first_name: "Firstname", email: "[email protected]", salutation: @salutation, debitor: @debitor }}
assert_response :redirect
follow_redirect!
assert_response :success
end
end
Luminárias - contatos
one:
last_name: MyString
first_name: MyString
email: MyString
salutation: one
debitor: one
Jogos - saudações
one:
salutation: MyString
Jogos - devedores
one:
company: MyString
street: MyString
house_number: MyString
zip: 1
city: MyString
payment_terms: one
Eu acho que suas chaves de parâmetros de teste deveriam ser
salutation_id
edebitor_id
Você precisa passar o id do registro e não o registro inteiro e usar o mesmo nome das chaves do parâmetro esperado.
Mas o teste precisa de algumas melhorias para que realmente teste os aspectos importantes da ação do controlador.
Isso testa se o registro foi realmente criado e se o local é o último registro criado, em vez de apenas o controlador redirecioná-lo para um caminho arbitrário que o deixa aberto a falsos positivos.