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

私はそれを思います

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

動作するはずです

于 2012-04-30T19:36:30.633 に答える
0

の内部は、ファイル名としてfr呼び出すことをどのように知ってGetFileいますか?foo2.txtテスト仕様を広く設定しているように見えますが(^foo\\d.txt$)、モックを狭く設定しているようです(foo2.txt)、その逆ではないでしょうか。

于 2012-04-30T19:38:51.210 に答える