【问题标题】:Rails/Rspec: Having tough time writing testsRails/Rspec:很难编写测试
【发布时间】:2013-10-07 20:35:11
【问题描述】:

首先,在使用 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 方法编写测试时,我有点迷茫。任何帮助将不胜感激!

【问题讨论】:

  • 这里有什么问题?
  • 如何在我的 Webhook 类中围绕 process 方法编写测试

标签: ruby-on-rails rspec shoulda


【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多