2016-05-13 9 views
0

Ich habe einen sehr einfachen Controller, der so aussieht.Rails Rspec-Controller-Test gibt einen unbekannten Hash

module Veterinarians 
    module Dictionaries 
    class SpecialitiesController < ApplicationController 
     respond_to :json 

     skip_before_action :check_current_vet, only: %i(index) 

     def index 
     @specialities = Veterinarians::Speciality.all 
     respond_with(@specialities) 
     end 
    end 
    end 
end 

Ich habe einen RSPC-Controller-Test, der so aussieht.

require 'rails_helper' 

Rails.describe Veterinarians::Dictionaries::SpecialitiesController, type: :controller do 
    # Not returning a response body in JSON when testing RSPEC (https://github.com/rails/jbuilder/issues/32) 
    render_views true 

    routes { Veterinarians::Engine.routes } 

    let(:user) { double :user, id: 123 } 
    before { sign_in(user) } 

    context '#index' do 
    let(:speciality) { double :speciality, id: :some_id, value: :some_val } 

    before { allow(Veterinarians::Speciality).to receive(:all).and_return [speciality] } 

    subject { get :index, format: :json } 

    it { is_expected.to have_http_status(:ok) } 
    it { expect(JSON.parse(subject.body)).to include('id' => 'some_id', 'value' => 'some_val') } 
    end 
end 

Das zweite Beispiel schlägt mit diesem Fehler fehl.

expected [{"__expired" => false, "name" => "speciality"}] to include {"id" => "some_id", "value" => "some_val"}

Irgendwelche Hinweise, warum dies nicht und wo die Hash würde mit „__expired“ herkommt?

Ich habe andere Tests, die diese gleiche Testmethode verwenden, die erfolgreich sind.

Antwort

0

Schienen windet sich mit dem Aufruf to_json auf dem Doppel. Sie haben diese Methode nicht auf die doppelte, also die to_json Methode Schienen hinzugefügt, die Object genannt wird.

Diese implementation speichert nur die Instanzvariablen des Objekts, was in diesem Fall der interne Zustand des Testdoppels ist.

Sie könnten stub to_json auf dem Doppel, obwohl Ihre Spezifikation würde nicht eine ganze Menge zu diesem Zeitpunkt testen.

0

Sie sollten Factories zum Erstellen Ihrer Testdaten verwenden. Zwei der beliebtesten sind FactoryGirl oder FactoryBot.

Beispiel:

FactoryGirl.define do 
    factory :user do 
    sequence(:email) { |n| "name#{n}@example.com" } 
    password 'password' 
    end 
end 

Die sequence(:email) erstellen Sie eine andere E-Mail für jeden Benutzer. Weitere Details finden Sie unter here.

Verwandte Themen