2017-05-11 2 views
0

je l'ai écrit simple pour matcher réponse http:matcher simple personnalisé ne fonctionne pas

RSpec::Matchers.define :http_answer? do |answer| 
    match do 
    response.status == answer 
    end 
end 

Mais il est toujours: ok je l'ai utilisé dans les spécifications de demande. Où est-ce que je me trompe? Est-il possible d'écrire correctement un tel matcher?

Répondre

0

S'il vous plaît lire Relish Project: Rspec Rails 3.6

Il est intégré have_http_status matcher pour ce que vous essayez de faire.

require "rails_helper" 

RSpec.describe ApplicationController, :type => :controller do 

    controller do 
    def index 
     render :json => {}, :status => 209 
    end 
    end 

    describe "GET #index" do 
    it "returns a 209 custom status code" do 
     get :index 
     expect(response).to have_http_status(209) 
    end 
    end 

end 

Si pour une raison quelconque vous souhaitez encore écrire votre propre matcher pour un état de réponse du contrôleur assurez-vous que:

spécifications du contrôleur sont marqués par: type =>: contrôleur ou si vous avez défini config.infer_spec_type_from_file_location! en les plaçant dans spec/controllers.

... et la documentation bien pour Define Matcher

+0

Je sais 'have_http_status'. 'http_asnwer?' était un exemple pour étudier. J'ai aussi utilisé has_http_status dans les spécifications de requête/fonctionnalité, pas dans celles de contrôleur, et cela fonctionne. Ce que je ne comprends pas - pourquoi la variable globale (ou non?) 'Response' n'est pas visible dans mon matcher. – Dimitri