Ruby on rails 在Rspec中添加控制器宏

Ruby on rails 在Rspec中添加控制器宏,ruby-on-rails,rspec2,Ruby On Rails,Rspec2,我正在尝试为Rspec定义一些控制器宏。我使用rails 3并在spec/support/macros/controller_macros.rb中定义了我的宏,该文件如下所示: module ControllerMacros def self.login_admin #code end end 在我的等级库助手中,我有: config.include(ControllerMacros, :type => :controller) 所以在我的控制器规范中,

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

module ControllerMacros
    def self.login_admin
        #code
    end
end
在我的等级库助手中,我有:

config.include(ControllerMacros, :type => :controller)
所以在我的控制器规范中,我只是在我的管理测试中调用login\u admin,但是当我使用我得到的方法时

undefined local variable or method `login_admin' for #<Class:0xb6de4854> (NameError)
未定义的局部变量或#的“login_admin”方法(NameError)
起初我假设controller_macros.rb没有被包括在内,但当我在文件中添加一个“puts”时,这表明文件至少正在执行

我看不出我的设置有任何问题,将login\u admin方法复制到descripe块工作正常,因此我不确定它有什么问题。

试试看

ControllerMacros.login_admin

或者从方法定义中删除
self

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

下面是一个使用宏的好例子:

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

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


它提供了为每种情况编写宏的方法

一行回答:从方法定义中删除self

为什么?RSpec示例中提供了包含模块的方法

ControllerMacros
中定义的
login\u admin
方法将作为
login\u admin

具体来说:

重写
spec/support/macros/controller\u macros.rb
as

module ControllerMacros
    def login_admin
        #code
    end
end
然后告诉Rspec包含宏


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

我不是这方面的专家,但我认为这与在类级别定义的方法的作用域(self.)有关。您可能需要使用base.included或base.extended包含或扩展它,或者删除self.sorry self.included或self.extended。这确实有效,但不是rspec真正应该使用的方式抱歉,我不理解您的评论。如果要定义宏,您希望将其包含在许多不同的示例中,不是吗?因此,不需要使用
self
定义类方法。或者你是说别的什么?