2015-02-24 1 views
0

Je travaille avec rspec et webmock et je suis à la recherche dans la demande de stubbing. J'ai un problème quand j'essaie d'utiliser regex pour faire correspondre l'URI.Ruby - Webmock: Match URI en utilisant l'expression régulière

Tout fonctionnait très bien quand je le talon ci-dessous, sans faire correspondre un URI spécifique (/.*/)

it "returns nil and stores an error when the response code is not OK" do 
     stub_request(:get, /.*/). 
     with(
     :headers => insertion_api.send(:default_headers, false).merge('User-Agent'=>'Ruby'), 
     :body => {} 
    ). 
     to_return(
     :status => Insertion.internal_server_error.to_i, 
     :body => "{\"message\": \"failure\"}", 
     :headers => { 'Cookie' => [session_token] } 
    ) 

     expect(insertion_api.get_iou(uid)).to be_nil 
     expect(insertion_api.error).to eq("An internal server error occurred") 
    end 

Comme je veux être plus précis dans mon test pour améliorer la lisibilité, si J'essaie de correspondre à un URI spécifique: /insertion_order/012awQQd champs = nom, le type & profondeur = 4 à l'aide du talon ci-dessous:

it "returns nil and stores an error when the response code is not OK" do 
      stub_request(:get, %r{insertion_order/\w+\?fields\=[\w,]+\&depth\=[0-9]}). 
      with(
      :headers => insertion_api.send(:default_headers, false).merge('User-Agent'=>'Ruby'), 
      :body => {} 
     ). 
      to_return(
      :status => Insertion.internal_server_error.to_i, 
      :body => "{\"message\": \"failure\"}", 
      :headers => { 'Cookie' => [session_token] } 
     ) 

      expect(insertion_api.get_iou(uid)).to be_nil 
      expect(insertion_api.error).to eq("An internal server error occurred") 
     end 

exécuter le test que j'ai:

WebMock::NetConnectNotAllowedError: 
     Real HTTP connections are disabled. Unregistered request: GET https://mocktocapture.com/mgmt/insertion_order/0C12345678 with body '{}' with headers {'Accept'=>'application/vnd.xxx.mgmt+json; version=2.0', 'Cookie'=>'y0Urv3ryLon6s3cur1tYT0k3ng0zeh3r3', 'User-Agent'=>'Ruby'} 

     You can stub this request with the following snippet: 

     stub_request(:get, "https://mocktocapture.com/mgmt/insertion_order_units/0C12345678"). 
     with(:body => "{}", 
       :headers => {'Accept'=>'application/vnd.dataxu.mgmt+json; version=2.0', 'Cookie'=>'y0Urv3ryLon6s3cur1tYT0k3ng0zeh3r3', 'User-Agent'=>'Ruby'}). 
     to_return(:status => 200, :body => "", :headers => {}) 

     registered request stubs: 

     stub_request(:get, "/insertion_order\/\w+\?fields\=[\w,]+\&depth\=[0-9]/"). 
     with(:body => {}, 
       :headers => {'Accept'=>'application/vnd.xxx.mgmt+json; version=2.0', 'Cookie'=>'y0Urv3ryLon6s3cur1tYT0k3ng0zeh3r3', 'User-Agent'=>'Ruby'}) 

Le regex Je l'ai utilisé est correct, mais je ne comprends pas pourquoi je l'ai reçu ce message d'erreur.

Répondre

0

La demande est que vous avez:

https://mocktocapture.com/mgmt/insertion_order/0C12345678 

Vous avez donné l'expression rationnelle: "\"

%r{insertion_order/\w+\?fields\=[\w,]+\&depth\=[0-9]} 

Dans le regexp vous avez spécifié la qu'il est obligatoire que la demande contienne "?" (ou une requête) après "insertion_order/\ w +". Dans la requête, vous n'avez aucun paramètre de requête. C'est pourquoi il ne correspond pas à la demande.

Une façon de résoudre ce problème est de rendre optionnelle la partie qui vient après "insertion_order/\ w +" dans l'expression rationnelle. Je le ferais comme ceci:

%r{insertion_order/\w+(\?fields\=[\w,]+\&depth\=[0-9])?} 
+0

hey @Iimekin merci pour cela, mais en fait cela ne résout pas le problème. Dois-je compléter l'expression régulière afin de correspondre également https://mocktocapture.com/mgmt? – AlessioG

+0

Oui, si vous voulez faire correspondre cela aussi, vous devriez le compléter. – limekin