2012-03-06 25 views
4

私はminitest/mockを使用しており、クラスを模擬したいと思います。私はモデルクラス自体をテストしようとしているのではなく、サービス(SomeService)がモデル(SomeModel)とやりとりすることをテストしようとしています。クラスをRubyでモックするにはどうすればいいですか?

私はこの(ハック:: ClassDelegate)を思い付いたが、私はそれは良いアイデアだ確信していない:

require 'minitest/autorun' 
require 'minitest/mock' 

module Hack 
    class ClassDelegate 
    def self.set_delegate(delegate); @@delegate = delegate; end 
    def self.method_missing(sym, *args, &block) 
     @@delegate.method_missing(sym, *args, &block) 
    end 
    end 
end 

class TestClassDelegation < MiniTest::Unit::TestCase 

    class SomeModel < Hack::ClassDelegate ; end 

    class SomeService 
    def delete(id) 
     SomeModel.delete(id) 
    end 
    end 

    def test_delegation 
    id = '123456789' 
    mock = MiniTest::Mock.new 
    mock.expect(:delete, nil, [id]) 

    SomeModel.set_delegate(mock) 
    service = SomeService.new 
    service.delete(id) 

    assert mock.verify 
    end 
end 

私はクラスをあざけることは、とにかく素晴らしいアイデアではないことをかなり確信しています、しかし、私はいくつかのテストを書く必要があるレガシーシステムを持っています。私はそのシステムの周りにいくつかのテストをラップするまでシステムを変更したくありません。

答えて

5

私は少し複雑だと思います。これについて何を:

mock = MiniTest::Mock.new 
SomeService.send(:const_set, :SomeModel, mock) 
mock.expect(:delete, nil, [1]) 
service = SomeService.new 
service.delete(1) 
mock.verify 
SomeService.send(:remove_const, :SomeModel) 
+0

それは間違いなく、あまりにも複雑(そして厄介)です。残念ながら、私はあなたのメソッドを試してみると "動的定数の割り当て"を取得します。 – darscan

+0

Aha。 – darscan

+0

定数を設定するためにsend:const_setを使用し、それを削除するために:remove_constを使用するように答えを更新した場合は、次のようになります。私はそれを受け入れたものとしてマークします。ご協力いただきありがとうございます! – darscan

2

同じ問題に実行していて、かなり長い間それについて考えた後、私は一時的に、クラスの定数を変更すると、おそらくそれを行うための最善の方法であることがわかった(エリオットは彼の答えに示唆して同じように)。

しかし、私はそれを行うためのよりよい方法を見つけた:https://github.com/adammck/minitest-stub-const

この宝石を使用して、あなたはこのようなあなたのテストを書くことができ:

def test_delegation 
    id = '123456789' 
    mock = MiniTest::Mock.new 
    mock.expect(:delete, nil, [id]) 

    SomeService.stub_const 'SomeModel', mock do 
    service = SomeService.new 
    service.delete(id) 
    end 

    assert mock.verify 
end 
+0

ああ、ええ、これは間違いなく良いです。私は承認する:) –

+0

ありがとう!別の例があります:http://stackoverflow.com/a/23071915/242933 – ma11hew28

関連する問題