gpt4 book ai didi

ruby-on-rails - 使用Mocha模拟/ stub Application Controller方法(使用Shoulda,Rails 3)

转载 作者:行者123 更新时间:2023-12-04 06:04:08 24 4
gpt4 key购买 nike

在为 Controller 编写功能测试时,遇到了一个场景,在该场景中,我有一个before_filter从数据库中请求我的一项测试所需的信息。我正在使用Factory_girl生成测试数据,但是我想避免在不需要数据库时直接访问数据库。我也想避免在这里测试我的before_filter方法(我打算在一个单独的测试中对其进行测试)。据我了解,模拟/ stub 是实现此目的的方法。

我的问题是,在这种情况下,模拟/ stub 此方法的最佳方法是什么。

我的before过滤器方法根据URL中找到的子域在db中查找站点,并设置要在 Controller 中使用的实例变量:


#application_controller.rb

def load_site_from_subdomain
@site = Site.first(:conditions => { :subdomain => request.subdomain })
end

我的 Controller 使用此方法作为before_filter:

# pages_controller.rb

before_filter :load_site_from_subdomain

def show
@page = @site.pages.find_by_id_or_slug(params[:id]).first
respond_to do |format|
format.html { render_themed_template }
format.xml { render :xml => @page }
end
end

如您所见,它依赖于要设置的 @site变量(由before_filter设置)。但是,在测试期间,我想让测试假设已设置 @site,并且它至少具有1个关联页面(通过 @site.pages找到)。我想稍后再测试 load_site_from_subdomain方法。

这是我测试(使用Shoulda&Mocha)得到的结果:

context "a GET request to the #show action" do

setup do
@page = Factory(:page)
@site = Factory.build(:site)

# stub out the @page.site method so it doesn't go
# looking in the db for the site record, this is
# used in this test to add a subdomain to the URL
# when requesting the page
@page.stubs(:site).returns(@site)

# this is where I think I should stub the load_site_from_subdomain
# method, so the @site variable will still be set
# in the controller. I'm just not sure how to do that.
@controller.stubs(:load_site_from_subdomain).returns(@site)

@request.host = "#{ @page.site.subdomain }.example.com"
get :show, :id => @page.id
end

should assign_to(:site)
should assign_to(:page)
should respond_with(:success)

end

这使我的测试结果出现错误,告诉我 @site为nil。

我觉得我要走错路了。我知道仅通过Factory.create这个站点就可以在数据库中存在它很容易,但是正如我之前所说,我想减少数据库的使用以帮助保持测试的速度。

最佳答案

尝试 stub “Site.first”,因为它是您需要 stub 的@site变量的设置,而不是来自before_filter的返回变量。

关于ruby-on-rails - 使用Mocha模拟/ stub Application Controller方法(使用Shoulda,Rails 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com