3 votes

Bonne façon de tester le service utilisé par le contrôleur

Étant donné le code ci-dessous :

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

Maintenant, ma question est la suivante : quel est le bon endroit pour tester le comportement de _undo_previous_run ?

  • BarServiceSpec ?
  • FooControllerSpec ? (appel de l'action de création, etc.)
  • D'autres ?

1voto

Sergii K Points 785

Les tests sont généralement utilisés comme "documentation" pour l'API d'une classe. _undo_previous_run est une méthode privée et on ne peut y accéder directement. Je préfère tester/décrire le comportement des méthodes publiques.

Dans ce cas, vous devez tester BarService.new méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X