2

私はNMockが初めてで、一般的に嘲笑しています。期待を再定義することは可能ですか? 実際、多くのメソッドを持つインターフェイスをモックしたいと考えています。そこで、一般的なメソッドの期待値を因数分解して、1000 回も書く必要がないようにすることにしました。私の問題は次のとおりです。ファイルをロードするスタブの方法があります。ほとんどの場合、モックはこのメソッドに対して何もしません。そこで、[SetUp] で期待値を因数分解しました。

Stub.On(myMock).Method("Load").Will(Return.Value(True));

しかし、テストケースでは、モックを使用するオブジェクトが例外にうまく応答することをテストしたいので、テストメソッドを入れます:

Stub.On(myMock).Method("Load").Will(Throw.Exception(new FileNotFoundException()));

テストをデバッグすると、Load メソッドが True を返していることがわかります。これは理解できますが、メソッドの例外をリセットしたり、再定義したりすることはできますか?

4

1 に答える 1

2

これを行うための良い方法を見つけたことはありません。特定の呼び出しに必要な値を設定するには、カスタム アクションを使用する必要がありました。このようなもの:

[TestFixture]
public class Testing
{
    public interface IXyz
    {
        bool Load();
    }

    public class DelegateAction<T> : NMock2.IAction
    {
        private Func<T> _resultFunc;

        public void SetResultFunction(Func<T> func)
        {
            _resultFunc = func;
        }

        public DelegateAction(Func<T> resultFunc)
        {
            _resultFunc = resultFunc;
        }


        public void Invoke(Invocation invocation)
        {
            invocation.Result = _resultFunc();
        }

        public void DescribeTo(TextWriter writer)
        {
        }
    }

    private bool _result = true;
    private DelegateAction<bool> _action;

    [Test]
    public void ResetTheReturnValue()
    {
        //would be done in general setup...
        Mockery mocker = new Mockery();
        IXyz test = mocker.NewMock<IXyz>();
        _action = new DelegateAction<bool>(() => _result);
        Stub.On(test).Method("Load").Will(_action);

        //Reset for test.... - if you comment it out true is 
                       //returned as default and the test passes
        _action.SetResultFunction(() => { throw new Exception();});

        Assert.IsTrue(test.Load());
    }
}

通常、フィールドを変更することで実行できる別の値を時折返したいだけなので、通常は関数を設定することはできません。テストの最後に必ずリセットしてください。

はい、私はこれがかなりくだらないことを知っています。誰かがそれを知っていれば、より良い方法が大好きです. 余談ですが、NMock にこだわっていない場合は、代わりに Moq のようなものを試してみてください。明らかにあなたのマイレージは異なるかもしれませんが、私はそれでより良い結果を得る傾向があります:)

于 2011-12-13T12:47:23.223 に答える