0

首先,在使用 Rails 编写测试时,我是个新手。感谢您[预先] 的耐心等待。

这是我的课:

require 'json'

class Webhook
  attr_accessor :customer_id, :response, :event_type

  ACCEPTED_EVENTS = ["customer.subscription.deleted", "invoice.payment_succeeded", "invoice.payment_failed"]

  def initialize(json = nil)
    if json
      @response = JSON.parse(json, symbolize_names: true)
      @customer_id = @response[:data][:object][:customer]
      @event_type = @response[:type]
      @user = User.find_by_customer_id(@customer_id)
    end
  end

  def event_accepted?
    true if ACCEPTED_EVENTS.include?(@event_type)
  end

  def process
    return unless event_accepted?

    case @event_type
    when "invoice.payment_succeeded"
      begin
        invoice = Stripe::Invoice.retrieve(@response[:data][:object][:id])
        InvoiceMailer.payment_succeeded_email(@user, invoice).deliver if invoice.amount_due > 0
      rescue => e
        Rails.logger.info "An error as occurred! #{e}"
      end
    when "customer.subscription.deleted"
      @user.expire! if @user
    when "invoice.payment_failed"
      InvoiceMailer.payment_failed_email(@user).deliver
    end
  end
end

到目前为止,这是我的测试:

require 'spec_helper'

describe Webhook do

  describe "instance methods" do
    let(:webhook) { Webhook.new }

    describe "#event_accepted?" do
      it "returns true with a correct event_type" do
        webhook.event_type = "customer.subscription.deleted"
        webhook.event_accepted?.should be_true
      end

      it "returns false with an incorrect event_type" do
        webhook.event_type = "foobar123"
        webhook.event_accepted?.should be_false
      end
    end
  end
end

在尝试为该#process方法编写测试时,我有点迷茫。任何帮助将不胜感激!

4

1 回答 1

2

您有 7 种不同的路径来测试您的过程方法。我正在为两个场景编写测试,剩下的留给你尝试。另请注意,我的测试是假设其他方法进程调用是单独测试的。

这里可能有轻微的语法/错误,因为它未经测试。但它会让您了解如何测试过程方法

describe "Process" do
  it "should do nothing if the event is not accepted" do
    webhook = Webhook.new
    webhook.stub(:event_accepted?).and_return(false)
    InvoiceMailer.should_not_receive(:payment_succeeded_email)
    InvoiceMailer.should_not_receive(:payment_failed_email)
    webhook.process
  end

  it "should send a payment succeeded email if the event type is success" do
    customer = FactoryGirl.create(:user)
    webhook = Webhook.new({"type": "invoice.payment_succeeded", "data": {"object": {"id": 1, "customer": customer.id}}})
    Stripe::Invoic.should_receive(:retrieve).with("1").and_return(invoice = double("invoice", :amount_due => 20))
    InvoiceMailer.should_receive(:payment_succeeded_email).with(customer, invoice)
    webhook.process
  end

  it "should do nothing if the event type is success but the invoice due is zero" do
  end

  it "should log when there is an exception in processing the successful payment" do
  end

  it "should expire the user if the subscription is deleted" do
    customer = FactoryGirl.create(:user)
    webhook = Webhook.new({"type": "customer.subscription.deleted", "data": {"object": {"id": 1, "customer": customer.id}}})
    User.stub(:find_by_customer_id).with(customer.id).and_return(customer)
    customer.should_receive(:expire!)
    webhook.process
  end

  it "should do nothing if the subscription is deleted and the user is invalid" do
    webhook = Webhook.new({"type": "customer.subscription.deleted", "data": {"object": {"id": 1, "customer": customer.id}}})
    User.stub(:find_by_customer_id).with(customer.id).and_return(nil)
    User.any_instance.should_not_receive(:expire!)
    webhook.process
  end

  it "should send a failure email if the payment was not successful" do
  end
end
于 2013-10-07T21:48:09.580 回答