【问题标题】:use a ruby gem in development for rails and test method exposure在开发中使用 ruby​​ gem 进行 Rails 和测试方法公开
【发布时间】:2013-02-04 03:58:37
【问题描述】:

我有一个简单的任务,我可以用一个 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”)。

感谢您提供的任何指导,我很感激!

【问题讨论】:

  • 虽然没有必要回答,但我认为在不同的文件中创建相同的模块是不好的。要么将其分解为不同的模块名称,要么将其全部放入一个文件中。
  • 我正在研究的这本书做了很多,但你的评论很有意义并且很有帮助......谢谢我打破它。
  • 我很好奇,你在写哪本书?我怀疑他们这样做是为了让事情变得简单,代价是强制执行不良做法。
  • 由 jose valim 制作 rails 应用程序

标签: ruby testing gem


【解决方案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

你能成功运行这个吗?

【讨论】:

  • 返回错误。 `':未初始化的常量 ListCleanerTest::X::Hi (NameError)。我已经检查了几次我的错误,我会继续寻找和研究。你的回答很有帮助,你告诉我,我不是在类中测试方法的存在,而是在调用时测试方法的响应......这很有意义......谢谢!
  • 我从“rails plugin new hi”重新开始......我的测试做了一些不同的事情(这让我感到困惑)。仍然失败...“ 应为 .
  • 很高兴为您提供帮助。为了让它更简单,试着让你的代码作为 Ruby 代码运行,而不是作为 Rails 插件运行。代替“test”关键字,使用 Ruby Minitest 例如“def test_says_hello”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多