1

我有一个简单的任务,我可以用一个 ruby​​ 脚本完成,但我想学习如何制作 gem,甚至可能在 rails 应用程序中使用它;最好的方法似乎总是带有人为表示的实际应用程序。最终目标是解析一个 csv 文件,根据过滤器(正则表达式匹配)排除一些行,并输出剩下的内容;这里显示的是一个简单的 hello world 来帮助我解决这个问题。我被困在两件事上。

  1. 我是否正在正确运行我的代码作为正在进行的工作?例如,如果这是一个简单的脚本,我只需进入终端并运行“ruby list_cleaner.rb”,它就会执行......但现在我有了这个 gem 文件结构,我不确定我应该调用哪个文件?当我调用我的顶级 gem/gem_name.rb 脚本时,什么也没有发生(正如我所期望的,因为我在该文件中所做的只是自动加载其他文件)。当我调用第一个自动加载的文件(base.rb)时,它可以工作,但是在 WIP 期间我应该如何运行这个东西?

  2. 如何测试来自另一个文件中的一个模块或类的方法是否可以被另一个访问?断言种类?断言无?我似乎无法弄清楚!所以我在我的 '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”)。

感谢您提供的任何方向,我很感激!

4

1 回答 1

1

你试图一次做很多事情。

此代码更简单,并展示了如何为模块编写测试:

#foo/lib/hi.rb
module Hi

  def hi
    puts "hello"
  end

end

#foo/test/hello_test.rb
class HelloTest < ActiveSupport::TestCase

  class X
    include Hi
  end

  test "says hello" do
    assert_equal X.new.hi, "hello"
  end

end

要使用纯 ruby​​ 运行测试:

ruby -Ilib -Itest test/*.rb

你能成功运行它吗?

于 2013-02-04T09:13:16.063 回答