2013-08-10 3 views
1

주제에 대해 약간의 인터넷 검색을 해봤지만 여전히 혼란 스럽습니다.RSpec으로 API 리소스를 테스트하십시오.

Zendesk API Ruby Client로 사용자 정의 도움말 페이지를 만들고 있는데, ZendeskAPI::Ticket 리소스 생성을 테스트해야 할 단계에 있습니다. 다음 코드는 spec/features 디렉토리에 있습니다. 유효한 값을 가진 양식을 채우고 양식을 #create 조치로 제출합니다. 상당히 표준적이고 간단한 것들.

require 'spec_helper' 

feature 'ticket creation' do 
    scenario 'user creates new ticket' do 
    visit root_path 

    fill_in 'Name', with: 'Billybob Joe' 
    fill_in 'Email', with: '[email protected]' 
    fill_in 'Subject', with: 'Aw, goshdarnit!' 
    fill_in 'Issue', with: 'My computer spontaneously blew up!' 
    click_button 'Create Ticket' 

    expect(page).to have_content('Ticket details') 
    end 
end 

그리고 여기는 티켓 컨트롤러의 관련 부분입니다. ticket_valid? 메서드는 해시 옵션에 대한 최소 유효성 검사를 제공하고 clientZendeskAPI::Client의 인스턴스입니다.

def create 
    options = { subject: params[:subject], comment: { value: params[:issue] }, 
       requester: params[:email], priority: 'normal' } 
    if ticket_valid? options 
    flash[:success] = 'Ticket created.' 
    @ticket = ZendeskAPI::Ticket.create(client, options) 
    redirect_to ticket_path(@ticket.id) 
    else 
    flash[:error] = 'Something went wrong. Try again.' 
    redirect_to root_url 
    end 
end 

문제는 내가 테스트를 실행 할 때마다, 실제 티켓은 그냥 실제로 티켓을 생성하지 않고 성공적으로 양식 제출을 테스트 할 때이 나중에 수동으로 삭제해야 할거야 젠 데스크 백엔드에서 생성된다.

제 질문은 입니다. 테스트를 실행할 때마다 Zendesk 백엔드에서 실제 티켓을 만들지 않고 티켓 생성 양식을 테스트하려면 어떻게해야합니까?

내 인터넷 검색의 결과로 읽었던 기사와 블로그는 RackTest를 사용하는 것을 막연하게 나타내지 만, 다른 사람들은 카피 바라를 전혀 사용하지 않는 것이 좋습니다. 이로 인해 더 혼란 스럽습니다. 나는 아직 RSpec에 비교적 익숙하지 않고 API를 사용하여 Rails 애플리케이션을 다루는 것에있어서 새로운 것이기 때문에 명확한 설명은 훌륭 할 것이다.

미리 감사드립니다. 넌 최고야.

답변

0

Zendesk에 전화하고 싶지 않으면 실제 통화 대신 "test double"을 만들어야합니다. RSpec과 함께 제공되는 테스트 이중 기능은 최소한 https://github.com/rspec/rspec-mocks에 설명되어 있지만 블로그 및 서적에서보다 포괄적으로 다루어집니다.

동시에 게시 된 답변에는 별도의 클래스를 만드는 방법이 설명되어 있지만 여전히 Zendesk 티켓을 만드는 것 같습니다. 실제로는 별도의 클래스가 필요하지 않으며 ZendeskAPI 객체를 전혀 만들 필요가 없습니다. 대신 ZendeskAPI::Ticket#create에 스텁을 지정하여 테스트 이중을 반환하면 나머지 Zendesk 티켓 메서드를 제공해야합니다 (적어도 id 포함).

카피 바라의 사용은 실제로 2 차적으로 문제를 일으키며 테스트 운전 방법을 나타냅니다. 그러나 테스트에는 현재 티켓 페이지를 렌더링하고 해당 페이지의 내용을 확인해야합니다. 컨트롤러를 "그냥"테스트하려면 올바른 호출 (예 : ZendeskAPI::Ticket)을 테스트하고 해당 페이지로 리디렉션 할 수 있습니다. 또한, 만약 당신이 그렇게한다면, 당신은 당신의 테스트 이중에서 훨씬 적은 시뮬레이션을 할 수 있습니다.

1

이렇게하는 한 가지 방법은 ZenDesk의 인터페이스를 자신의 클래스로 추상화 한 다음 테스트에서 조롱하는 것입니다.

class ZendeskGateway 

    def create_ticket(client, options) 
    ZendeskAPI::Ticket.create(client, options) 
    end 

end 

그런 다음 코드에서, 당신은 당신의 인터페이스 클래스와 컨트롤러의 젠 데스크의 API의 사용을 대체 :

class TicketsController < ApplicationController 

    attr_accessor :zendesk_gateway 

    after_initialize :init 

    def init 
    @zendesk_gateway = ZendeskGateway.new 
    end 

    def create 
    options = { subject: params[:subject], comment: { value: params[:issue] }, 
        requester: params[:email], priority: 'normal' } 
    if ticket_valid? options 
     flash[:success] = 'Ticket created.' 

     @ticket = @zendesk_gateway.create_ticket(client, options) 

     redirect_to ticket_path(@ticket.id) 
    else 
     flash[:error] = 'Something went wrong. Try again.' 
     redirect_to root_url 
    end 

    end 

end 

예를 들어, 인터페이스 클래스를 만들 수 있습니다 이제 추상화되었으므로 테스트 중에 메소드를 스텁 (stub)하여 Zendesk에 실제로 호출하지 않도록 조롱 프레임 워크 (예 : mocha)를 사용할 수 있습니다.

zendesk_ticket = ZendeskAPI::Ticket.new(client, :id => 1, :priority => "urgent") 

@controller.zendesk_gateway.expects(:create_ticket).returns(zendesk_ticket) 

이것은 매우 빠르고/더러운 예제였습니다. 그러나 잘하면 당신은 일반적인 생각을 볼 수 있습니다.

관련 문제