簡體   English   中英

使用Moq模擬帶有條件參數的方法

[英]Mocking a method with conditional arguments using Moq

我有一個類,我是單元測試,以驗證特定的異常條件是否正常處理。 為此,我模擬了內部調用的方法以拋出異常。

我的模擬設置看起來像這樣:

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

有人在評論中建議我應該嘗試

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

他引用了一些關於泛型的奇怪之處。 我不知道它是否與泛型有任何關系,但這種改變確實有效。 由於海報刪除了他的評論,我正在代替他。

我覺得

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

應該管用

fr的內部如何通過foo2.txt作為文件名來調用GetFile 看起來你正在廣泛地設置你的測試規范( ^foo\\\\d.txt$ ),但你的模擬狹窄( foo2.txt ),不應該是相反的方式嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM