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