需要Ruby Gem中的rspec测试路径

时间:2017-04-01 09:33:11

标签: ruby rubygems

我正在创建一个简单的Ruby Gem,目前按照Making your own gem文档中的示例进行布局。

我的目录结构:

.
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── go_run
│   │   ├── parser.rb
│   │   └── runner.rb
│   └── go_run.rb
└── spec
    ├── go_run_spec.rb
    ├── parser_spec.rb
    └── runner_spec.rb

我最初只在Runner lib/go_run/runner.rb中调用Runner类,但现在,根据记录的示例,我将其命名为GoRun::Runner。代码有效。问题是现在运行bundle exec rspec spec/parser_spec.rb没有。它失败了:

/home/smurf/dev/ruby/go_run/lib/go_run/parser.rb:3:in `<top (required)>': uninitialized constant GoRun (NameError)

该文件的第3行是:

class GoRun::Parser

我使用require spec/parser_spec.rb require 'go_run/parser'中的require_relative '../lib/go_run/parser'库代码。

我尝试将其包含在 AND Goal.goals != "AAA" 中,但这会产生同样的错误。

有人知道我做错了吗?

更新:我已在此分支上传完整代码:https://github.com/henrytk/go_run/tree/stackoverflow-43155117

1 个答案:

答案 0 :(得分:1)

问题源于lib/go_run/parser.rb,而不是来自测试本身。每当Ruby找到GoRun::Parser定义时,它会在常量查找表中查找GoRun,但它不会出现在那里,因此程序会以错误退出。

请注意,使用lib/go_run.rb作为入口点也不起作用,因为在定义 go_run/parser.rb之前需要{em}

部分问题是使用GoRun作为两者项目级命名空间和入口点GoRun

你应该考虑修复这种情况的几个习语:

  1. class设为顶级GoRun,纯粹用于命名空间。将当前逻辑中的逻辑移动到其自己的module中,例如class。然后将go_run/cli.rb文件保存为一种清单文件,该文件需要项目的类。

  2. 使用嵌套的go_run.rb - 和module语法。这将定义外部模块,如果它已经不存在。

  3. 使用class文件使用spec_helper.rb引导您的项目,以确保在运行测试之前所有内容都已正确加载。