我刚开始在我的单元测试中使用Moq,但我遇到了单元测试通过的问题 - 我认为不应该这样。
我有两个对象,一个将数据发送到队列,另一个实现INotifier
,如果调度程序失败则调用它们,它们看起来像这样(为简洁而减少):
public class EmailNotifier : INotifier
{
public void Notify(string message)
{
// sends the notification by email
}
}
public class Despatcher
{
public void Despatch(int batchNumber, INotifier failureNotifier)
{
try
{
if (batchNumber.Equals(0)) throw new InvalidOperationException("Error message");
}
catch (InvalidOperationException ex)
{
failureNotifier.Notify(ex.ToString());
throw ex;
}
}
}
我正在对Despatcher
进行单元测试,专门用于验证Notify
在我提供的INotifier
(我正在嘲笑)时是否被调用{我故意强迫传递0批次号码导致Despatcher
失败。我设置了这样的模拟:
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void Despatcher_notifies_on_failure()
{
var mockNotifier = new Mock<EmailNotifier>();
mockNotifier.Setup(n => n.Notify(It.IsAny<string>())).Verifiable();
var despatcher = new Despatcher();
despatcher.Despatch(0, mockNotifier.Object);
mockNotifier.Verify(n => n.Notify(It.IsAny<string>()), Times.Once());
}
这传递了测试罚款,预计为0批次编号会引发异常,导致INotifier
调用Notify
(当我逐步完成测试时,一切都按预期工作)。
所以,我继续评论failureNotifier.Notify(ex.ToString())
行并再次运行测试 - 通过罚款?我不确定我是否正确设置和验证,因为我现在只使用Moq大约2个小时,但我认为我正确地理解了这一点,但这只是让我有点兴奋。我希望这个测试失败,因为我特别想确保在失败的情况下调用Notify
- 这里有人能看到任何明显错误吗?提前感谢您的帮助。
答案 0 :(得分:7)
您的测试永远不会进入验证部分。为什么?这一行
despatcher.Despatch(0, mockNotifier.Object);
抛出异常,由ExpectedException
属性消耗,测试结束。 mockNotifier.Verify
行永远不会被执行。
您想要的是两个单元测试,而不是:
.Verify
)。请注意,您必须将.Despatch
调用包装到try { } catch { }
,以便忽略该异常。ExpectedException
)