1

次のようなコントローラーがあります。

class ReportsController < ApplicationController
    respond_to :html
  def show
    client = ReportServices::Client.new(ServiceConfig['reports_service_uri'])
    @report = client.population_management(params[:id])
    if @report
      @kpis = @report[:key_performance_indicators]
      @populations = @report[:population_scores]
      @population_summaries = @report[:population_summaries]
      @providers = @report[:provider_networks]
    end
    respond_with (@report)   
  end
end

RSpec テストを作成したいのですが、どこから始めればよいかわかりません。その URL が含まれているためだと思いますが、それは私にとって難しいことです。私は Rails と RSpec にかなり慣れていないため、私のモデルのRSpecを書いていますが、これは週末全体で私を困惑させました。

4

2 に答える 2

1

クライアント インターフェイスをスタブして、コントローラーの分離テストを作成できます。

describe RerpotsController do
  it "assigns a new report as @report" do
    expected_id = '1234'
    expected_kpi = 'kpi'

    report = { key_performance_indicators: expected_kpi, ... }
    client = double(ReportServices::Client)
    client.should_receive(:population_management).with(expected_id) { report }
    ReportServices::Client.should_receive(:new) { client }

    get :show, id: expected_id

    assigns(:kpis).should eq(expected_kpi)
    # ...
  end
end

おそらく、コントローラーでレポートを展開する必要はありません。

于 2013-02-24T19:22:21.093 に答える
1

したがって、最初に取り組むべきことは、外部 API 要求をモックすることです。ここでの一般的な考え方は、population_management に応答して @report に期待するものを返す new からモック オブジェクトを返すということです。

describe ReportsController do
  before do
    @report_data = {
      :key_performance_indicators => 'value',
      :population_scores => 'value',
      :population_summaries => 'value',
      :provider_networks => 'value'
    }
    # This will fake the call to new, return a mock object that when
    # population_management is called will return the hash above.
    @fake_client = double(:population_management => @report_data)
    ReportServices::Client.stub(:new => @fake_client)
  end

  describe '#show' do
    it 'assigns @report' do
      get :show, id: 1
      assigns(:report).should == @report
    end

    it 'assigns some shortcut vars' do
      [:kpis, :populations, :population_summaries, :providers].each do |var|
        assigns(var).should_not be_nil
      end
    end

    # and whatever else you'd like
  end
end
于 2013-02-24T19:23:42.180 に答える