gpt4 book ai didi

ruby-on-rails-3 - 如何在 rspec 中编写 Rails 3.1 引擎 Controller 测试?

转载 作者:行者123 更新时间:2023-12-02 09:38:19 26 4
gpt4 key购买 nike

我已经用命名空间 Posts 编写了一个 Rails 3.1 引擎。因此,我的 Controller 在 app/controllers/posts/中,我的模型在 app/models/posts 等中。我可以很好地测试模型。一种型号的规范看起来像......

module Posts
describe Post do
describe 'Associations' do
it ...
end

......一切正常。

但是, Controller 的规范不起作用。 Rails 引擎安装在/posts,而 Controller 是 Posts::PostController。因此,测试寻找 Controller 路由为帖子/帖子。
  describe "GET index" do
it "assigns all posts as @posts" do
Posts::Post.stub(:all) { [mock_post] }
get :index
assigns(:posts).should eq([mock_post])
end
end

这产生...
  1) Posts::PostsController GET index assigns all posts as @posts
Failure/Error: get :index
ActionController::RoutingError:
No route matches {:controller=>"posts/posts"}
# ./spec/controllers/posts/posts_controller_spec.rb:16

我在测试应用程序的路由文件中尝试了各种技巧......:命名空间等,但无济于事。

我如何使这项工作?似乎不会,因为引擎将 Controller 放在/posts,但命名空间将 Controller 放在/posts/posts 以进行测试。

最佳答案

我假设您正在使用一个虚拟的 rails 应用程序测试您的引擎,就像由 enginex 生成的应用程序一样。 .

您的引擎应该安装在虚拟应用程序中:

spec/dummy/config/routes.rb :

Dummy::Application.routes.draw do
mount Posts::Engine => '/posts-prefix'
end

我的第二个假设是你的引擎是孤立的:

lib/posts.rb :
module Posts
class Engine < Rails::Engine
isolate_namespace Posts
end
end

我不知道这两个假设是否真的需要,但这就是我自己的引擎的结构。

解决方法很简单,而不是这个
get :show, :id => 1

用这个
get :show, {:id => 1, :use_route => :posts}
:posts符号应该是您的引擎的名称,而不是安装它的路径。

这是有效的,因为 get 方法参数直接传递给 ActionDispatch::Routing::RouteSet::Generator#initialize (定义 here ),反过来使用 @named_routeRack::Mount::RouteSet#generate 获取正确的路线(参见 herehere )。

深入 Rails 内部很有趣,但很耗时,我不会每天都这样做 ;-) 。

HTH

关于ruby-on-rails-3 - 如何在 rspec 中编写 Rails 3.1 引擎 Controller 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200654/

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