4

私は Java 開発者で、Ruby をいじっていて、Ruby を愛しています。Ruby のメタプログラミング機能のおかげで、単体テストがよりクリーンになり、面倒なモック フレームワークが必要ないことがわかりました。クラスのサービスを必要とするFileクラスがあり、テストでは実際のファイルシステムに触れたくありません。Java では、偽のオブジェクトを渡すための「継ぎ目」を簡単にするために仮想ファイル システムを使用しますが、Ruby では明らかにやり過ぎです。私が思いついたことは、Java の世界と比べてすでに本当に素晴らしいように思えます。テスト中のクラスには、オプションのコンストラクターパラメーターがあります。

def initialize(file_class=File)

クラス内でファイルを開く必要がある場合は、次のようにします。

@file_class.open(filename)

そして、呼び出しは実際のファイルクラスに行くか、私の単体テストの場合は、ファイルシステムに触れない偽のクラスに行きます。メタプログラミングでこれを行うためのより良い方法があるに違いないことを私は知っていますか?

4

3 に答える 3

12

Mocha ( http://mocha.rubyforge.org/ ) は、Ruby の非常に優れたモッキング ライブラリです。実際にテストしたいものに応じて (つまり、ファイル システムの依存関係を回避するために File.new 呼び出しを偽造したい場合や、正しい引数が File.new に渡されていることを確認したい場合)、次のことができます。このようなもの:


require 'mocha'

mock_file_obj = mock("My Mock File") do
  stubs(:some_instance_method).returns("foo")
end

File.stubs(:new).with(is_a(String)).returns(mock_file_obj)

于 2008-09-16T13:36:51.757 に答える
1

あなたが概説した場合、私はあなたがやっていることはうまくいくように思われることをお勧めします。ジェームス・ミード(モカの作者)が提唱したテクニックだと知っています。そのためだけにメタプログラミングを行う必要はありません。 James がそれについて述べていることは次のとおりです (および、試すことができる他のテクニックの長いリスト)。

于 2008-09-16T15:30:30.127 に答える