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 回答