我已经中定义的具有功能的模块:红宝石:试图object.send带有参数的模块功能
module Settings
def find_by_name(name, start)
puts "find_by_name: Found me!"
end
在MINITEST我想要的方式来测试“送”给这个函数它在运行时模拟动态定义/调用它。这就是我想在MiniTest中做的事情。
require 'settings'
class TestFileUtilities < MiniTest::Unit::TestCase
def test_dynamic_call_to_Settings
foreign_function = 'Settings::find_by_name'
send(foreign_function, 'name.txt', 'Users/MCP/Desktop/Projects/TestDir')
end
我所期待的是,发送()将调用“foreign_function”方法,将字符串转换为一个符号,然后将两个参数添加到呼叫。我只想要的是没有错误,并放置到我的控制台,以便我知道它的工作......然后我将开始定义“断言”。现在,虽然我得到:
NoMethodError: undefined method `Settings::find_by_name' for #<TestFileUtilities:0x007fdf59840310>
这是我第一次与Ruby的动态调用方法,我能得到它,当我不使用范围解析运算符的工作能力玩耍和在TestFileUtilities
内部是include Settings
,但我宁愿使用范围,以便用户定义的函数不会与我的类中的任何内容发生冲突(不仅与MiniTest冲突,而且与实际的FileUtilities类冲突)。任何想法/帮助将大大apprecaited!对于那些在这里寻找信息的人来说,this是让我开始的东西。
所以我意识到我在制定我的问题时弄错了复制/粘贴工作。我想要做的是调用一个模块中定义的函数。这不是在一个班级。我似乎没有尝试过任何东西,或者你建议的任何工作。所做的工作是将用户定义的函数放在该模块内部的一个类中,实例化该类的一个实例,然后在其上调用send()到一个我不知道存在的方法,但是如果用户完成了他的工作,应该是这样的......)规范可行......而且我会测试更多。只是想说谢谢,并确保我没有错过任何东西。 – MCP
你似乎很困惑。 'obj.send(:foo,args)'与'obj.foo(args)'完全相同。 'send(str)'相当于'send(str.to_sym)'如果你调用模块方法,那么'obj'应该是模块。如果你正在调用实例方法,那么obj就是一个类的实例。如果你有一个你想混入另一个模块的模块,你可以使用'include'将它作为实例方法混合,'extend'作为类方法。你说我的建议不起作用 - 如果你想得到更好的帮助,请准确地展示你的尝试。 – dbenhur
我是,但我到了那里。感谢您的回应。我发布了下面的工作总结。有一件事我仍然困惑,并会在今天读到,这就是模块如何在Ruby中作为对象工作。我知道用户定义的函数将存活的模块,并且在我的类文件(我试图从中发送)中要求它。我宁愿不必用'self'来定义用户定义的函数(见下文),但这是行得通的。思考? – MCP