title: how to test stripe failure case with rspecs?
body: <p>I have the following endpoint in payment controller that completes the purchase. I am using rspecs for testing. For mocking stripe i am using webmock gem. Now i would like to test the failure case i.e rescue Stripe::CardError => e part. I have commented below #Failure Case.</p>
  
  <pre><code>   def create
  
      @cart.user = current_user
  
      customer = Stripe::Customer.create email: stripe_params['sender_email'],
                                         source: stripe_params["card_token"]
  
      Stripe::Charge.create customer: customer.id,
                            amount: @cart.subtotal,
                            description: 'Gift Purchase',
                            currency: 'usd'
  
      render "confirmation"
  
     rescue Stripe::CardError =&gt; e
       #Failure Case
       flash[:alert] = e.message
       redirect_to new_payment_path
     end
  </code></pre>
  
  <p>My rspecs test case looks like follows. First i am stubbing web request used by stripe. How should i stub the request so that stripe throws Stripe::CardError exception and failure branch is executed. Hope i have made the problem clear. I appreciate any help. Thanks!</p>
  
  <pre><code> context "invalid purchases" do 
  
     it "card error" do
  
         stub_request(:post, "https://api.stripe.com/v1/customers").
           with(
             body: {"email"=&gt;"asd@asd.com"},
             headers: {
            'Accept'=&gt;'*/*',
            'Accept-Encoding'=&gt;'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
            'Authorization'=&gt;'Bearer sk_test_UEBAIinq8viQ875czrsC18ZX',
            'Content-Type'=&gt;'application/x-www-form-urlencoded',
            'User-Agent'=&gt;'Stripe/v1 RubyBindings/3.17.0',
            'X-Stripe-Client-User-Agent'=&gt;'{"bindings_version":"3.17.0","lang":"ruby","lang_version":"2.3.4 p301 (2017-03-30)","platform":"x86_64-linux","engine":"ruby","publisher":"stripe","uname":"Linux version 4.9.120-c9 (root@b1cff69ce3c3) (gcc version 8.2.0 (Debian 8.2.0-4) ) #1 SMP Wed Aug 15 22:48:26 UTC 2018","hostname":"kofhearts-ktmbasket-6224565"}'
             }).
           to_return(status: 200, body: {id: 1}.to_json, headers: {})
  
  
  
  
       stub_request(:post, "https://api.stripe.com/v1/charges").
           with(
             body: {"amount"=&gt;"123", "currency"=&gt;"usd", "customer"=&gt;"1", "description"=&gt;"Gift Purchase"},
             headers: {
            'Accept'=&gt;'*/*',
            'Accept-Encoding'=&gt;'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
            'Authorization'=&gt;'Bearer sk_test_UEBAIinq8viQ875czrsC18ZX',
            'Content-Type'=&gt;'application/x-www-form-urlencoded',
            'User-Agent'=&gt;'Stripe/v1 RubyBindings/3.17.0',
            'X-Stripe-Client-User-Agent'=&gt;'{"bindings_version":"3.17.0","lang":"ruby","lang_version":"2.3.4 p301 (2017-03-30)","platform":"x86_64-linux","engine":"ruby","publisher":"stripe","uname":"Linux version 4.9.120-c9 (root@b1cff69ce3c3) (gcc version 8.2.0 (Debian 8.2.0-4) ) #1 SMP Wed Aug 15 22:48:26 UTC 2018","hostname":"kofhearts-ktmbasket-6224565"}'
             }).
           to_return(status: 200, body: {id: 1}.to_json, headers: {})
  
  
  
        visit root_path
  
        expect(page).to have_content('teddy')
        click_button('Add to Basket')
        expect(page).to have_content('Your Basket')
        click_link('Checkout')
        click_link('Guest Checkout')
  
        find('label', :text =&gt; 'Credit Card').click
        fill_in 'card_number', with: '4242424242424242'
        fill_in 'card_verification', with: '123'
        fill_in 'exp_month', with: '12'
        fill_in 'exp_year', with: '19'
  
        click_button('Submit')
  
  
  
     end
  
   end
  </code></pre>