YounG for You

don't be only father of your children

如何制作自己的gem (二)

| Comments

接上篇,如何制作自己的GEM (一)

写测试

泰斯特你的gem是贼拉的重要!它不仅帮助你确认你的代码是可以运行的,而且它也帮助别人了解你的gem是顺利工作的。当衡量一个gem时,ruby开发者倾向于通过查看一套可靠的测试(或者说由于缺少测试)来作为信任这段代码的主要理由。

Gems支持在代码包里添加测试文件,所以当下载完gem后我们就可以开始测湿了。有一个致力于此的社区已经出现,它的名字叫GemTesters,这里有详细的文档介绍在不同的Ruby架构和解释器中运行gem测湿。

一句话不割:请测试你的GEM!

Test::Unit是Ruby内置的测湿框架。网上狼哇多的教程介绍如何使用它。当然还有许多其他的测试框架可用。Rspec是很流行的一个。说白了,不管你用哪个,测湿就行!

下面咱们给女神加点测湿。需要再加几个文件:一个是Rakefile,还有一个全新的test文件夹:

1
2
3
4
5
6
7
8
9
10
11
12
% tree
.
├── Rakefile
├── bin
│   └── nvshen
├── nvshen.gemspec
├── lib
│   ├── nvshen
│   │   └── translator.rb
│   └── nvshen.rb
└── test
    └── test_nvshen.rb

Rakefile可以让你自动跑测湿:

1
2
3
4
5
6
7
8
9
% cat Rakefile
require 'rake/testtask'

Rake::TestTask.new do |t|
  t.libs << 'test'
end

desc "Run tests"
task :default => :test

现在执行rake test或者就rake就能跑测湿啦。呵呵,下面是一个女神的基本测湿文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% cat test/test_nvshen.rb
require 'test/unit'
require 'nvshen'

class NvshenTest < Test::Unit::TestCase
  def test_english_hello
    assert_equal "hello nvshen",
      nvshen.hi("english")
  end

  def test_any_hello
    assert_equal "hello nvshen",
      nvshen.hi("ruby")
  end

  def test_spanish_hello
    assert_equal "你好 女神",
      nvshen.hi("chinese")
  end
end

最后执行测湿:

1
2
3
4
5
6
7
8
9
10
% rake test
(in /Users/qrush/Dev/ruby/nvshen)
Loaded suite
Started
...
Finished in 0.000736 seconds.

3 tests, 3 assertions, 0 failures, 0 errors, 0 skips

Test run options: --seed 15331

绿灯通过!好吧,其实取决与你的shell配色。想学习更多的好例子,最佳实践就是去github瞎溜达并且读别人的代码。


给代码写文档

大多数gems默认用RDoc来生成文档。有大量好的教程传授如何用RDoc来写文档。下面是一个简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# The main Nvshen driver
class Nvshen
  # Say hi to the world!
  #
  # Example:
  #   >> Nvshen.hi("chinese")
  #   => 你好 女神
  #
  # Arguments:
  #   language: (String)

  def self.hi(language = "english")
    translator = Translator.new(language)
    puts translator.hi
  end
end

另一个出色的文档选择是YARD,因为当你推送gem时,RubyDoc.info会通过你的gem自动生成YARDocs。 YARD向后兼容RDoc,并且有一篇文章很好的文章介绍了他们的区别以及用法。


总结

有了一个构建RubyGem的基本思路,我们希望你将去亲自实践。


演员表

这篇教程借鉴了Gem Sawyer的Modern Day Ruby Warrior,由Jerry Huo翻译改编。如有巧合,纯属雷同!

Comments