使用RSpec测试Rails控制器 - 如何测试:current_account.projects
问题描述:
我正在使用Rspec和Rails 3进行测试。我已经测试过我的模型和帮手,但是我对如何开始测试控制器感到迷茫。几乎所有我在我的控制器行动的数据可以用下面的这些例子拉住:使用RSpec测试Rails控制器 - 如何测试:current_account.projects
@services = current_account.services
@projects = current_person.projects
@projects = current_account.projects.active
# this is really @projects = current_person.account.projects.active)
我似乎无法找到如何测试真实拉这样的数据的例子。我找到的所有例子都没有限定在某个帐户或某个人的范围内。任何人都可以给我一个关于如何模拟或存根这种安排的文章吗?这是否表示整个方法不正确?下面,我包含了一个完整的示例控制器。
任何帮助将不胜感激。
谢谢, 大卫
class ServicesController < ApplicationController
# Run authorizations
filter_resource_access
# Respond to ...
respond_to :html, :xml, :json
respond_to :js, :only => [:new, :create, :edit, :update, :destroy]
# GET /services
# GET /services.xml
def index
@services = current_account.services.order("name").paginate(:page => params[:page])
respond_with(@services)
end
# GET /services/1
# GET /services/1.xml
def show
@service = current_account.services.find(params[:id])
respond_with(@service)
end
# GET /services/new
# GET /services/new.xml
def new
@service = current_account.services.new
respond_with(@service)
end
# GET /services/1/edit
def edit
@service = current_account.services.find(params[:id])
respond_with(@service)
end
# POST /services
# POST /services.xml
def create
@service = current_account.services.new(params[:service])
if @service.save
# flash[:notice] = 'A service was successfully created.'
end
respond_with(@service, :location => services_url)
end
# PUT /services/1
# PUT /services/1.xml
def update
@service = current_account.services.find(params[:id])
if @service.update_attributes(params[:service])
# flash[:notice] = 'The service was successfully updated.'
end
respond_with(@service, :location => services_url)
end
# DELETE /services/1
# DELETE /services/1.xml
def destroy
@service = current_account.services.find(params[:id])
if @service.destroy
flash[:notice] = "The service was successfully deleted."
else
flash[:warning] = @service.errors.full_messages.inject("") { |acc, message| acc += message }
end
respond_with(@service)
end
end
------ UPDATE
由于Xaid的解决方案,我能得到一个解决方案:
context "logged_in" do
before(:each) do
@current_account = Factory.create(:account)
controller.stub!(:current_account).and_return(@current_account)
@services = FactoryGirl.create_list(:service, 10, :account => @current_account)
@services << @current_account.services.first
@current_account.services.stub!(:all).and_return(@services)
end
# INDEX
describe "GET services" do
before(:each) do
get :index
end
it "should set @services when accessing GET /index" do
assigns[:services].should == @services
end
it "should respond with success" do
response.should be_success
end
end
end
答
不能使用这样的事情来测试你的'索引'行动
describe "GET 'index'" do
before(:each) do
@user = FactoryGirl.create(:user)
controller.stub!(:current_user).and_return(@user)
@services = FactoryGirl.create_list(:service, 10, :user => @user)
@user.services.stub!(:all).and_return(@services)
end
it "should return a list of services" do
get :index
assigns(:services).should == @services
end
end
如果我正确理解您的问题,您应该能够存根current_user.services(或项目)并使其返回一些已知值(由FactoryGirl在我的示例中生成),并检查存储在您的操作中的值(例如,您的'索引'操作中的@services)。
谢谢!这是我第一次使用存根,所以我对从哪里开始有点困惑。我会给你一个镜头,让你知道它是如何为我工作的。 – 2012-03-27 03:26:22