1

こんにちは、moq フレームワークについて学習しようとしていますが、単純な概念を理解できていないようです。テストしているコードは次のとおりです。

 public interface ILongRunningLibrary {
    string RunForALongTime(int interval);
}

public class LongRunningLibrary : ILongRunningLibrary {

    public string RunForALongTime(int interval) {
        var timeToWait = interval * 1000;
        Thread.Sleep(timeToWait);

        return string.Format("Waited {0} seconds ", interval);
    }
}

そして、ここに私のテストがあります:

private Mock<ILongRunningLibrary> _longRunningLibrary;

    [SetUp]
    public void SetupForTest() {
        _longRunningLibrary = new Mock<ILongRunningLibrary>();
    }

    [Test]
    public void TestLongRunningLibrary() {
        const int interval = 30;
        _longRunningLibrary.Setup(lrl => lrl.RunForALongTime(30))
                          .Returns("This method has been mocked!");
        var result = _longRunningLibrary.Object.RunForALongTime(interval);
        Debug.WriteLine("Return from method was '{0}'", result);
    }

私が読んでいる本から私が理解したことから、このメソッドは NUnit コンソールで「このメソッドはモックされています」を返す必要があるということです。しかし、私の場合、テストはパスし、何も返されません。

削除しても:

_longRunningLibrary.Setup(lrl => lrl.RunForALongTime(30))
                          .Returns("This method has been mocked!");

テストは引き続き成功し、コンソールには何も出力されません。

NUnit コンソールで「このメソッドはモックされています」が返されないのはなぜですか?

4

2 に答える 2

2

最初の例は問題なく動作します。あなたのテスト ランナーは Debug.WriteLine の呼び出しに失敗していると思います。これを Console.WriteLine に置き換えたところ、正しい出力が得られました。

2 番目の例で Setup 呼び出しを削除すると、モックは Loose 動作を使用するため、デフォルト値 (null) を返します。null パラメーターを指定して Debug.WriteLine を呼び出すと、例外がスローされないため、テストは成功します。

StrictBehavior を一般的に使用することをお勧めします。

_longRunningLibrary = new Mock<ILongRunningLibrary>(MockBehavior.Strict);

RunForALongTime メソッドの設定がないため、例外がスローされます。

于 2013-02-15T13:35:13.450 に答える
0

ええと...私は今日同じ問題に直面しましたが、本当の原因を見つけたと思います:

NUnit の GUI に移動し、表示 -> 結果タブ -> テキスト出力...

「トレース出力」がデフォルトでチェックされていないことがわかるので、それをチェックすると、Debug.WriteLine は期待どおりに動作します...

そのため、確認するか、 Console.WriteLine を使用してそのままにしておくことができます。

于 2014-06-11T13:53:19.243 に答える