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 替换了它,我得到了正确的输出。

当您在第二个示例中删除 Setup 调用时,模拟将返回默认值(为 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 回答