我正在创建一个简单的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
答案 0 :(得分:1)
问题源于lib/go_run/parser.rb
,而不是来自测试本身。每当Ruby找到GoRun::Parser
定义时,它会在常量查找表中查找GoRun
,但它不会出现在那里,因此程序会以错误退出。
请注意,使用lib/go_run.rb
作为入口点也不起作用,因为在定义 go_run/parser.rb
之前需要{em}
部分问题是使用GoRun
作为两者项目级命名空间和入口点GoRun
。
你应该考虑修复这种情况的几个习语:
将class
设为顶级GoRun
,纯粹用于命名空间。将当前逻辑中的逻辑移动到其自己的module
中,例如class
。然后将go_run/cli.rb
文件保存为一种清单文件,该文件需要项目的类。
使用嵌套的go_run.rb
- 和module
语法。这将定义外部模块,如果它已经不存在。
使用class
文件使用spec_helper.rb
引导您的项目,以确保在运行测试之前所有内容都已正确加载。