5

我有一个我正在单元测试的类,以验证特定的异常条件是否得到妥善处理。为此,我模拟了内部调用以抛出异常的方法。

我的模拟设置如下所示:

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);
}
4

3 回答 3

10

有人在评论中建议我应该尝试

It.Is<string>(a => Equals(a, "foo2.txt"))

他列举了仿制药的一些奇怪之处。我不知道它是否与泛型有关,但这种变化确实有效。由于发帖人删除了他的评论,我代替他回答。

于 2012-05-02T17:48:39.527 回答
0

内部如何fr知道以GetFile文件foo2.txt名调用?似乎您正在广泛地设置您的测试规范(^foo\\d.txt$)但您的模拟是狭隘的(foo2.txt),不应该反过来吗?

于 2012-04-30T19:38:51.210 回答
0

我觉得

m.PutFile(It.IsAny<IFileConnection>(), "foo2.txt")

应该管用

于 2012-04-30T19:36:30.633 回答