31

この質問と同じように、私も Ryan Bates の nifty_scaffold を使用しています。これには、Mocha のany_instanceメソッドを使用して、コントローラーの背後に埋め込まれたモデル オブジェクトに「無効な」状態を強制するという望ましい側面があります。

リンク先の質問とは異なり、RSpec を使用していませんが、Test::Unit を使用しています。つまり、そこにある 2 つの RSpec 中心のソリューションは、私にとってはうまくいかないということです。

any_instance スタブを削除する一般的な (つまり、Test::Unit で動作する) 方法はありますか? テストでバグが発生していると思われるので、それを確認したいと思います。

4

3 に答える 3

49

たまたま、Mocha 0.10.0ではany_instance()でスタブを解除できます。

str = "Not Stubbed!"
String.any_instance.stubs(:to_s).returns("Stubbed!")
puts str.to_s   # "Stubbed!"
String.any_instance.unstub(:to_s)
puts str.to_s   # "Not Stubbed!"
于 2011-12-21T19:29:36.523 に答える
4

モカはそのような機能を提供していません。ただし、自分で実装することはできます。

最初に知っておくべきことmochamocha、スタブすると元のメソッドが実際に置き換えられるということです。したがって、後でこれらのメソッドを復元できるようにするには、前のメソッドへの参照を保持する必要があります。これは、次の方法で簡単に実現できますalias new_method old_method。をモックするに実行する必要がありますold_method

ここで、メソッドのモックを解除するには、必要なのはalias old_method new_method

次のコードを検討してください。

class A
    def a
        true
    end
end


class TestA < Test::Unit::TestCase
    def test_undo_mock
        a = A.new
        A.class_eval {alias unmocked_a a}

        A.any_instance.stubs(:a).returns("b")
        assert a.a, "b"

        A.class_eval {alias a unmocked_a}
        assert a.a, "a"
    end
end
于 2010-05-24T12:17:33.920 に答える
0

一度にすべてのスタブ/期待を削除したい場合は、mocha_teardown を使用してそれを行うことができます (例: self.mocha_teardown を呼び出します)。

ただし、この場合は少し破壊的かもしれません。

于 2016-01-11T09:11:44.577 に答える