2013-10-07 68 views
0

首先,当谈到在Rails中编写测试时,我是一个新手。感谢您[耐心]耐心等待。Rails/Rspec:编写测试有困难时

这里是我的类:

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

这里有什么问题? – dax

+0

如何在我的Webhook类中围绕处理方法编写测试 – dennismonsewicz

回答

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 
+0

非常感谢您的一切!你真了不起! – dennismonsewicz

+0

你能解释一下'double'方法吗? – dennismonsewicz

+0

double给你一个嘲弄的对象。它与模拟(“对象”)/存根(“对象”)相同。这应该有助于你理解 - > https://relishapp.com/rspec/rspec-mocks/docs – usha