2012-12-07 3 views
0

레일 클래스 앱에 서비스 클래스가 있다고 가정 해 보겠습니다. 실제로 어떤 일을하는지는 중요하지 않지만 클라이언트에게 알림을 푸시하는 데 사용될 수 있다고 가정합니다.레일스 환경에서 서비스 클래스 분리하기

# lib/services/event_pusher.rb 
class EventPusher 
    def initialize(client) 
    @client = client 
    end 

    def publish(event) 
    PusherGem.trigger(@client, event) 
    end 
end 

나는 지금 내 컨트롤러에서이 클래스를 사용할 수 있습니다 : 나는 publish를 호출 할 때

require "lib/services/event_pusher" 

class WhateverController < ApplicationController 
    def create 
    @whatever = Whatever.new(params[:whatever]) 

    if @whatever.save 
     EventPusher.new(current_user).publish('whatever:saved') 
    end 
    end 
end 

지금이 서비스 클래스를 제 3 자에게 요청합니다. 나는 내 테스트를 실행할 때 그런 일이 일어나기를 원하지 않는다.

내가 보는 방법에는 두 가지 옵션이 있습니다.

옵션 1 : 나는 환경 검사와 EventPusher.trigger 모든 통화를 접미사에 기억해야
. 모든 앱 작성/업데이트/삭제 작업에서이를 호출 할 수 있음을 기억하십시오.

if @whatever.save 
    EventPusher.new(current_user).publish('whatever:saved') unless Rails.env.test? 
end 

옵션 2 :
나는 부부에 레일 내 서비스 클래스가 있습니다.

def publish(event) 
    PusherGem.trigger(@client, event) unless Rails.env.test? 
end 

올바른 옵션은 무엇입니까 (아니면 비밀 옵션 3이 있습니까?)?

답변

1

RSpec을 사용하고 있습니까? 그렇다면, 당신은 다음과 같이 시험 자체 내부의 EventPusher의 게시 방법의 기능을 대체 할 수 있습니다 :

EventPusher.any_instance.stub(:publish) 

위의 코드는 원래 전무를 반환하는 빈 방법과 방법을 게시 대체합니다. 메서드는 여전히 존재하지만 여전히 호출되지만 테스트 범위 내에서는 아무 것도 수행하지 않습니다. 당신이 PusherGem의를 대체 않으려면,

EventPusher.any_instance.stub(:publish).and_return(true) 

또는 : 다른 코드는 성공을 표시하는 '사실'로 뭔가를 반환 게시 방법을 기대하는 경우

, 당신은 다음을 추가 할 수 있습니다

PusherGem.stub!(:trigger) 

또는

PusherGem.stub!(:trigger).and_return("something here, perhaps?") 
정적 트리거 방법은,이 약간 다른 구문을 사용