3

我试图为 Rspec 定义一些控制器宏。我使用 rails 3 并在 spec/support/macros/controller_macros.rb 中定义了我的宏,该文件如下所示:

module ControllerMacros
    def self.login_admin
        #code
    end
end

在我的规范助手中,我有:

config.include(ControllerMacros, :type => :controller)

所以在我的控制器规范中,我只是在我的管理测试中调用 login_admin 但是当我使用我得到的方法时

undefined local variable or method `login_admin' for #<Class:0xb6de4854> (NameError)

起初我认为 controller_macros.rb 没有被包括在内,但是当我在文件中添加了一个“puts”时,这表明该文件至少正在被执行。

我看不出我的设置有什么问题,将 login_admin 方法复制到描述块中工作正常,所以我不确定它有什么问题。

4

3 回答 3

10

也许我迟到了,但对于新人来说。

这是使用宏的一个很好的例子:

http://osmose.6spot.com.br/2011/01/rails-resource-routing-spec-w-rspec/

当您包含一个模块时,它的方法在示例中是可见的。

但是当您扩展模块时,它的方法仅在示例之外可见。

它为您提供了针对每种情况编写宏的方法。

于 2011-01-25T01:40:55.857 回答
2

尝试

ControllerMacros.login_admin

self从方法定义中删除。

于 2010-11-19T22:08:43.267 回答
1

单行答案:从方法定义中删除 self

为什么?包含模块的方法在 RSpec 示例中可用

login_admin中定义的方法ControllerMacros将在您的 RSpec 示例中提供为login_admin

再具体一点:

改写spec/support/macros/controller_macros.rb

module ControllerMacros
    def login_admin
        #code
    end
end

然后告诉 Rspec 包含宏

config.include(ControllerMacros, :type => :controller)

于 2013-01-06T16:51:43.650 回答