【发布时间】:2013-02-04 03:58:37
【问题描述】:
我有一个简单的任务,我可以用一个 ruby 脚本完成,但我想学习如何制作 gem,甚至可能在 rails 应用程序中使用它;最好的方法似乎总是带有人为表示的实际应用程序。最终目标是解析一个 csv 文件,根据过滤器(正则表达式匹配)排除一些行,并输出剩下的内容;这里显示的是一个简单的 hello world 来帮助我解决这个问题。我被困在两件事上。
我是否将我的代码作为正在进行的工作正常运行?例如,如果这是一个简单的脚本,我只需进入终端并运行“ruby list_cleaner.rb”,它就会执行......但现在我有了这个 gem 文件结构,我不确定我应该调用哪个文件?当我调用我的顶级 gem/gem_name.rb 脚本时,什么也没有发生(正如我所期望的,因为我在该文件中所做的只是自动加载其他文件)。当我调用第一个自动加载的文件 (base.rb) 时,它可以工作,但是在 WIP 期间我应该如何运行这个东西?
如何测试来自另一个文件中的一个模块或类的方法是否可以被另一个访问?断言种类?断言无?我似乎无法弄清楚!所以我在我的 'contraints.rb' 文件中定义了一个方法 'hello',将其包含在 base.rb 中并命名为 'hello'。运行 base.rb 脚本时,我得到一个
uninitialized constant ListCleaner::Constraints (NameError)。我想弄清楚如何测试它并显然修复它!
下面是一些非常简单的hello world示例和文件结构。
顶级目录和gem名称是“list_cleaner”
#list_cleaner/lib/list_cleaner.rb
module ListCleaner
autoload :Base, 'list_cleaner/base'
autoload :Constraints, 'list_cleaner/constraints'
end
#list_cleaner/lib/base.rb
module ListCleaner
class Base
include ListCleaner::Constraints
hello #a method from the constraints rb auto loaded and included right?
end
end
#list_cleaner/lib/constraints.rb
module ListCleaner
class Constraints #long term this will be filled with 'filter' methods
def hello
puts('hello world')
end
end
end
#list_cleaner/test/list_cleaner_test.rb
require 'test_helper'
class ListCleanerTest < ActiveSupport::TestCase
test "truth" do
assert_kind_of Module, ListCleaner
end
test "constrains exposed to Base?" do
assert_kind_of constraints, base, 'msg' #is constraints part of base?
end
end
我正在阅读/阅读 Jose Valim 的“制作 Rails 应用程序”并使用一些互联网指南;似乎无法自己应用一些基本工作。通过这个例子,我真的只是想弄清楚如何从另一个文件(再次,模块,类,什么是最好的?)中调用一个文件(模块,类或最好的?)中的方法,并测试它。所以我不仅想让它全部工作,而且要测试它是否能与单元测试一起工作,并从终端调用它来查看它的执行情况(在这种情况下输出“hello world”)。
感谢您提供的任何指导,我很感激!
【问题讨论】:
-
虽然没有必要回答,但我认为在不同的文件中创建相同的模块是不好的。要么将其分解为不同的模块名称,要么将其全部放入一个文件中。
-
我正在研究的这本书做了很多,但你的评论很有意义并且很有帮助......谢谢我打破它。
-
我很好奇,你在写哪本书?我怀疑他们这样做是为了让事情变得简单,代价是强制执行不良做法。
-
由 jose valim 制作 rails 应用程序