1

私の仕様では、ページにアクセスして、インスタンス変数が正しく設定されていることを確認しています。assigns仕様は、がゼロであると常に言っています。保存されたページを見ると、404 やその他のエラー ページではなく空白です。

describe ArtistsController do
    before :each do
        @artist = Artist.first
    end
    describe "GET #about" do
        it "finds artist by artistname" do
            visit artist_about_path(@artist.artistname); save_page
            puts "2 ===================== #{ artist_about_path(@artist.artistname) }"
            # assigns(:artist).should eq(@artist)
            assigns[:artist].should_not be_nil
        end
        it "renders the :about view" do
            visit artist_about_path(@artist.artistname)
            # response.should render_template :about
            response.should be_success
        end
    end
# Similar specs for other pages to be rendered

Artist.firstデータベースにデータを入力するために spec_helper で実行されている rake タスクに由来します。その部分は他のテストで正しく機能します。

印刷してパスを確認していますが、問題ないようです。コントローラーのメソッド:

class ArtistsController < ApplicationController
before_filter :get_artist_from_params
def about
    @artist = Artist.find_by_artistname(params[:artistname].downcase)
    @contact_info = @artist.contact_info
    puts "1 ==============================="
    puts @artist.inspect
  end

サーバー ログで@artistは、 が期待されるオブジェクトです。

def get_artist_from_params
    if !params[:artistname].blank?
      @artist = Artist.find_by_artistname(params[:artistname].downcase)
      if @artist.blank?
        not_found
      end
    end
end

テストのどこが間違っているのかわかりません…puts正しい値を出力しています。

Ruby 2.0、Rails 3.2、Capybara 2.1、Rspec 2.12 を使用。

4

1 に答える 1

1

私はこのテストに少し混乱していますが、少しでも力になれるかもしれません。

aboutアクションを空白のままにしておくことができると思います:

def about
end

次に、 before_filter を次のようにクリーンアップできます。

private

def get_artist_from_params
  if params[:artistname]
    @artist = Artist.find_by_artistname(params[:artistname].downcase)
    if @artist
      @contact_info = @artist.contact_info
    else
      not_found
    end
  end
end

まず、インスタンス変数がコントローラーで適切に設定されていることを確認するだけであれば、統合テストを行う必要はないと正直に思います。ここhttp://guides.rubyonrails.org/testing.html#what-to-include-in-your-functional-testsに示すように、機能テストを行いたいと思います。よし、これまでの内容でこれができるか見てみましょう:

describe ArtistsController do
  let(:artist) { Artist.first } #May want to look into FactoryGirl
  describe "GET #about" do
    before :each do
      @parameters = { artistname: artist.name }
      Artist.should_receive(:find_by_artistname).with(artist.name.downcase).and_return(artist)
    end
    it "assigns artist and contact_info instance variables" do
      get :about, @parameters
      assigns(:artist).should eq(artist)
      assigns(:contact_info).should eq(artist.contact_info)
    end
    it "responds successfully" do
      get :about, @parameters
      expect(response).to be_success
    end
    it "renders about template" do
      get :about, @parameters
      expect(response).to render_template("about")
    end
  end
end

それが理にかなっている場合はお知らせください。追加の詳細を提供できます。

于 2013-07-02T03:44:55.710 に答える