Pergunta sobre testing, rspec, factory-bot, ruby-on-rails, rspec-rails – Testando "Postar criação" com o Rspec

6

Eu estou tentando testar uma ação "Post criar" com Rspec. O código é o seguinte:

<code>   def valid_attributes
     {
    :zone => Flymgr::Zone.new(:countries => Flymgr::ZoneCountry.first,
        :name => 'USA',
        :description => 'USA Flight',
        :zipcodes => ''),
    :price => '100.00',
    :class => 'first',

     }
   end

   def valid_session
     {}
   end

   before(:each) do
       @request.env["devise.mapping"] = Devise.mappings[:admin]
       admin = FactoryGirl.create(:admin)
       sign_in admin                           
      end

describe "POST create" do
     describe "with valid params" do
       it "creates a new Flymgr::Rule" do
         expect {
           post :create, {:Flymgr_rule => valid_attributes}
         }.to change(Flymgr::Rule, :count).by(1)
       end
</code>

Um dos atributos necessários para o formulário é uma 'zona', essa é uma caixa suspensa e as opções para a lista suspensa são criadas com um formulário diferente. Eu não sei como criar uma entrada de formulário usando o Rspec. Como você pode ver, eu tentei chamar um método de um controlador diferenteFlymgr::Zone.new. Eu não acho que isso está funcionando e está quebrando meu teste.

Alguém pode aconselhar sobre a melhor maneira de fazer isso? Talvez eu deva usar o FactoryGirl para criar uma entrada de zona e regra?

Sua resposta

2   a resposta
3

Enquanto oguia aponta:

<code># Returns a hash of attributes that can be used to build a User instance
attrs = FactoryGirl.attributes_for(:user)
</code>
5

zone, quando você postar ele será apenas 'to_s' ed, o que é improvável o que você deseja.

Em geral, a melhor prática é usar garota de fábrica para construir seus objetos e usar os atributos_para a estratégia para parametrizar seus atributos para a solicitação de postagem:Qual é a maneira correta de testar 'criar' ações do controlador?

Sua pergunta está sugerindo que a associação é um belongs_to, então você só precisa postar um id. Esteja ciente de que, no momento, o FactoryGirl não cria nenhum atributo para as associações. Se sua definição de fábrica para regra cuida da associação de zona, você pode usar esta solução alternativa:

<code>FactoryGirl.build(:flymgr_rule).attributes
</code>

para incluir também um zone_id, mas você precisa excluir os parâmetros indesejados. ("id", "created_at", "updated_at", etc).

Portanto, é melhor inserir explicitamente as informações de hash params para a zona da maneira como você as vê em uma solicitação de postagem válida.

Leia este tópico sobre atributos e associações de factorygirl:https://github.com/thoughtbot/factory_girl/issues/359

Perguntas relacionadas