gpt4 book ai didi

ruby-on-rails - Rails 和 RSpec : Testing controllers with the same name in different namespace (module)

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

我有使用 RSpec 3.4.0 测试的 Rails 4.1.16 API 应用程序,我在测试不同模块中的同名类时遇到问题。

结构是:

app/controllers/bar/notifications_controller.rb

class Bar::NotificationsController < ApiController
...
end

和不同模块中的同名 Controller :

app/controllers/foo/bar/notifications_controller.rb

module Foo
class Bar::NotificationsController < ApiController
...
end
end

Foo 是一个新模块,还没有测试。添加它之后,旧的 Bar::NotificationsController 的所有相应 Controller 测试开始失败。

规范文件:

spec/controllers/bar/notifications_controller_spec.rb

require 'spec_helper'

describe Bar::NotificationsController, type: :controller do
...
end

该规范文件中的所有测试都因相同的错误而失败:

RuntimeError:
@controller is nil: make sure you set it in your test's setup method.

当我在 Foo 模块中更改 Controller 名称时,问题不存在:

app/controllers/foo/bar/foo_notifications_controller.rb

module Foo
class Bar::FooNotificationsController < ApiController
...
end
end

我已经尝试在规范文件之上添加 require 'bar/notifications_controller' 并将类名用作字符串 describe "Bar::NotificationsController, type: :controller 但它没有解决问题(同样的错误)。

为什么会这样?解决方案是什么?

我想相信有一件我还没有尝试过的小事,我不必为了让规范通过而用无意义的名字污染我的代码和结构。

非常感谢您的帮助!

最佳答案

一般来说,我会在类定义中包含所有 命名空间。像这样的东西:

app/controllers/foo/bar/notifications_controller.rb

class Foo::Bar::NotificationsController < ApiController
...
end

乍一看,这可能与以下内容相同:

app/controllers/foo/bar/notifications_controller.rb

module Foo
class Bar::NotificationsController < ApiController
...
end
end

事实上,它们是不同的。区别在于 Rails 如何处理常量的自动加载。我不会在这里详细介绍,因为这是一个较长的主题,并且在 web-o-sphere 中有很好的文章/帖子。

您可以找到关于 Rails 如何处理自动加载的好文章,例如 this one (或尝试谷歌搜索 rails constant loading)

此外,如文章所述,Ruby 常量加载的操作方式与 Rails 加载不同。可以找到关于 Ruby 常量加载的好资料 here (或尝试使用谷歌搜索 ruby constant loading)。

关于ruby-on-rails - Rails 和 RSpec : Testing controllers with the same name in different namespace (module),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41461535/

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