Moq不会在NUnit控制台上返回消息

时间:2013-02-15 12:13:12

标签: moq

您好我正在尝试了解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控制台上没有返回“此方法已被模拟”?

2 个答案:

答案 0 :(得分:2)

你的第一个例子运行得很好。我认为你的测试运行器无法调用Debug.WriteLine。我用Console.WriteLine替换它,我得到了正确的输出。

在第二个示例中删除Setup调用时,mock将返回默认值(为null),因为它使用Loose行为。使用null参数调用Debug.WriteLine时,它不会抛出异常,因此测试通过。

一般情况下使用StrictBehavior是一种很好的做法。

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

现在它会抛出一个异常,因为你没有RunForALongTime方法的任何设置。

答案 1 :(得分:0)

好吧......我今天遇到了同样的问题,我相信我找到了真正的原因:

转到NUnit的GUI然后再查看 - &gt;结果标签 - &gt;文字输出......

正如您所看到的,“跟踪输出”未被检查为默认值,请检查它并且Debug.WriteLine按预期工作...

因此您可以检查它或使用Console.WriteLine并保持原样。