Rails / Rspec:编写测试时遇到困难

时间:2013-10-07 20:35:11

标签: ruby-on-rails rspec shoulda

首先,在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方法编写测试时,我有点迷失。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您有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