【问题标题】:Mocking a method with conditional arguments using Moq使用 Moq 模拟带有条件参数的方法
【发布时间】:2012-04-30 19:20:11
【问题描述】:

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

我的模拟设置如下所示:

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

【问题讨论】:

  • 看来应该可以了,能把整个测试用例的代码贴出来吗?
  • 你能分享你试图模拟的函数调用吗?
  • @BishopRook,我添加了测试。
  • 建议使用Equals() 的人的评论在哪里?那行得通。
  • @jimmy_keen:对我没用。我根据建议将It.Is&lt;string&gt;(a =&gt; a == "foo2.txt") 更改为It.Is&lt;string&gt;(a =&gt; Equals(a, "foo2.txt")) 并且有效。

标签: c# unit-testing mocking moq


【解决方案1】:

在cmets中有人建议我应该尝试

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

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

【讨论】:

    【解决方案2】:

    我认为

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

    应该工作

    【讨论】:

    • 这是我尝试的第一件事;它没有抛出异常,但它也没有工作。
    【解决方案3】:

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

    【讨论】:

    • 在夹具中所有测试用例的[Setup] 中,我创建了我使用的foo1.txtfoo2.txtfoo3.txt,然后在[Teardown] 方法中销毁文件.我希望“中间”文件无法确保它得到妥善处理。
    猜你喜欢
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2016-06-06
    • 2010-11-12
    • 2011-01-12
    • 2016-09-25
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多