1

このトピックについて少しグーグルで調べましたが、まだ混乱しています。

Zendesk API Ruby クライアントを使用してカスタム ヘルプ ページを作成していますが、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: 'joe@test.com'
    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

そして、これが Tickets コントローラーの関連部分です。このticket_valid?メソッドは、オプション ハッシュの最小限の検証を提供しclient、 のインスタンスですZendeskAPI::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 バックエンドで作成され、実際にチケットを作成せずにフォーム送信が成功するかどうかをテストしたいときに、後で手動で削除する必要があることです。

私の質問は、テストを実行するたびに Zendesk バックエンドで実際のチケットを作成せずに、チケット作成フォームをテストするにはどうすればよいですか?

グーグルで調べた結果、漠然とRackTestの使用について言及している記事やブログがありましたが、この種のことにはCapybaraをまったく使用しないことを提案しているものもあり、さらに混乱しています. 私はまだRSpecに比較的慣れておらず、APIを使用してRailsアプリを構築するのはさらに新しいので、明確な説明があれば素晴らしいでしょう.

前もって感謝します!!あなたは素晴らしいです。

4

2 に答える 2

1

これを行う 1 つの方法は、ZenDesk へのインターフェイスを独自のクラスに抽象化し、それをテストでモックすることです。

たとえば、インターフェイス クラスを作成できます。

class ZendeskGateway

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

end

次に、コードで、コントローラー内の Zendesk 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

メソッドが抽象化されたので、モック フレームワーク ( mochaなど) を使用して、テスト中にメソッドをスタブ化し、実際に Zendesk を呼び出さないようにすることができます。

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

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

これは非常に素早い/汚い例でした。しかし、うまくいけば、あなたは一般的なアイデアを見ることができます.

于 2013-08-11T00:17:21.540 に答える
0

Zendesk を呼び出したくない場合は、実際の呼び出しの代わりに「テスト ダブル」を作成する必要があります。RSpec に付属する test double 機能については、https://github.com/rspec/rspec-mocksで最低限しか説明されていませんが、ブログや書籍でより包括的に説明されています。

これと同時に投稿された回答では、別のクラスの作成について説明していますが、それでも Zendesk チケットの作成が必要なようです。実際には個別のクラスは必要なく、ZendeskAPI オブジェクトを作成する必要もまったくありません。代わりに、テスト double を返すためにスタブを作成します。ZendeskAPI::Ticket#createこの double は、残りのテストで必要な Zendesk チケット メソッド (少なくともid.

Capybara の使用は実際には二次的な問題であり、テストをどのように実行するかを指します。ただし、テストでは現在、チケット ページをレンダリングし、そのページのコンテンツをチェックする必要があることに注意してください。コントローラを「ただ」テストしたい場合は、コントローラが適切な呼び出し (たとえば へZendeskAPI::Ticket) を行い、適切なページにリダイレクトすることをテストできます/テストする必要があります。さらに、それだけを行うと、テストダブルでシミュレートする必要がはるかに少なくなります。

于 2013-08-11T00:17:36.187 に答える