我有一个我正在进行单元测试的类,以验证是否正常处理特定的异常情况。为此,我模拟了内部调用的方法以抛出异常。
我的模拟设置如下:
fr.CallBase = true;
fr.Setup(m => m.PutFile(It.IsAny<IFileConnection>(), It.IsAny<string>(), It.IsAny<string>()))
.Throws(new System.IO.IOException("Test Exception", new System.Net.Sockets.SocketException()));
这正是我想要的。
但是,现在,我想通过仅为特定值抛出异常来测试连续性。我认为它应该是这样的:
fr.Setup(m => m.PutFile(It.IsAny<IFileConnection>(), It.Is<string>(a => a == "foo2.txt"), It.IsAny<string>()))
.Throws(new System.IO.IOException("Test Exception", new System.Net.Sockets.SocketException()));
......但这似乎不起作用。我做错了什么?
按要求,整个测试:
[Test]
public void ManualRouteInterruptedInDownloadContinuesOn()
{
var firstRoute = this.UnitOfWork.GetFirstRoute();
Route r = this.UnitOfWork.GetRouteByID(firstRoute.RouteID);
r.RegExMatch = "^foo\\d.txt$";
r.Manual = true;
r.NotifyOfNewFiles = "me@company.com";
this.UnitOfWork.Save();
var fr = new Mock<ManualRouting>(r.RouteID);
fr.CallBase = true;
fr.Setup(m => m.GetFile(It.IsAny<IFileConnection>(), It.Is<string>(a => a == "foo2.txt"), It.IsAny<string>()))
.Throws(new System.IO.IOException("Test Exception", new System.Net.Sockets.SocketException()));
fr.Object.ExecuteRoute(firstRoute.RouteID);
Assert.IsTrue(fr.Object.Errors.Count == 1);
Assert.IsTrue(fr.Object.Matches.Count == 3);
}
答案 0 :(得分:7)
有人在评论中建议我尝试
It.Is<string>(a => Equals(a, "foo2.txt"))
他引用了一些关于泛型的奇怪之处。我不知道它是否与泛型有任何关系,但这种改变确实有效。由于海报删除了他的评论,我正在代替他。
答案 1 :(得分:0)
我认为
m.PutFile(It.IsAny<IFileConnection>(), "foo2.txt")
应该有效
答案 2 :(得分:0)
fr
的内部如何通过GetFile
作为文件名来调用foo2.txt
?您似乎正在广泛地设置您的测试规范(^foo\\d.txt$
),但您的模拟范围很窄(foo2.txt
),不应该是相反的方式吗?