正确的测试控制器使用的服务方式

时间:2016-07-02 15:37:40

标签: ruby ruby-on-rails-4 rspec tdd

鉴于以下代码:

class FooController < ApplicationController
  def create
    if auth_is_alright && params_are_cool #pseudocode
      @bar_results = BarService.new(param).run
    end
  end
end

class BarService
  def initialize(params)
    @transaction_token = params[:transaction_token]
    @id = params[:id]
    @quantity = params[:quantity]
    @value = params[:value]
    if Transaction.where(token: @transaction_token).any?
      _undo_previous_run    
    end
  end

  def run
    Transaction.new(token: @transaction_token, product_id: @id, quantity: @quantity, value: @value).save!
    product = Product.find(id: @id)
    product.update!(stock_quantity: product.stock_quantity - @quantity)
  end

private

  def _undo_previous_run
    transaction = Transaction.find_by_token(@transaction_token)
    product = Product.find(id: transaction.product_id)
    product.update!(stock_quantity: product.stock_quantity + transaction.quantity)
    transaction.destroy
  end

end

现在我的问题是,应该在哪里测试_undo_previous_run行为?

  • BarServiceSpec?
  • FooControllerSpec? (调用创建动作等)
  • 其他?

1 个答案:

答案 0 :(得分:1)

测试通常用于类API的“文档”。 _undo_previous_run是私有方法,无法直接访问。我更喜欢测试/描述公共方法的行为。

在这种情况下,您需要测试BarService.new方法。