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