0

私のアプリケーションのコードを閲覧している間、私はこれに直面しました:

private string[] ReadFromFile(string path)
{
    string[] data = null;
    try
    {
        data = File.ReadAllLines(path);
    }
    catch (Exception)
    {
        throw new Exception("The file is not correct");
    }

    return data;
}

さて、このコードは良くないことを知っているので、これをリファクタリングしようとしていました。ただし、このコードは、FitNesseの一部のテストの定義で使用されます。このコードは本番環境では使用されません。このメソッドで指定されたパラメーターは常に正しいはずです。そのため、try / catchブロック全体を削除して、必要に応じてクラッシュさせたいと思います。FitNesseは、スローされた例外に関する詳細をすべて提供してくれますが、これはテストフィクスチャであるため、問題ないかどうか疑問に思っています。

File.ReadAllLinesさまざまな例外をスローできます。

だから私の質問:本番コードのテストに使用されたとしても、本番外で、制御下の環境でそのような種類のコードを使用することは許容されますか?それともどんな状況でも悪いですか?

4

3 に答える 3

2

このようなコードを単体テストに含めることは、本番コードに含めるよりもさらに悪いことです。本番コードでは、一部の例外の詳細を非表示にすることが理にかなっている場合がありますが(たとえば、それらは引き続き配信される必要がありますInnerException)、単体テストでは、(エンドユーザーではなく開発者)のため行われるため、常に可能な限り多くのことを確認する必要があります。 。したがって、このtry/catchブロック全体を削除する必要があると思います。

また、他の場合にテストに失敗したい場合は、Assert.Fail("message")構造を使用することをお勧めします。これにより、テストがこの時点に達した場合に失敗したものとして扱われることがより明確になります。ただし、FitNesseに適用できるかどうかはわかりません。

于 2012-08-03T08:18:54.347 に答える
1

私はそれをキャッチし、FitNesseの機能を活用する合理化された例外をスローします

private string[] ReadFromFile(string path)
{
    string[] data = null;
    try
    {
        data = File.ReadAllLines(path);
    }
    catch (Exception)
    {
        throw new Exception("message:<<Problem reading in file: " +e.getMessage() + ">>");
    }

    return data;
}

これを行うと、エラーメッセージがコンテキストに表示され、識別しやすくなります。残念ながら、ラップされていない例外は、問題が発生したフィクスチャとは別の例外ブロックに表示されます。e.printStackTrace()は、出力ページに詳細情報を提供します。

私は、単体テストコードで、コードのコンテキストで例外を発生させたいという他の人たちに同意します。ただし、単体テストの場合、対象者は異なります。それを扱う人々は常に開発者でなければなりません。FitNesseテストの場合、BAおよびテスターと協力しており、少し余分な診断の恩恵を受ける可能性があります。

追加したコードはJavaであり、これがac#テストであることはわかっていますが、精神は同じであり、「メッセージ:<<例外」はFitSharpforslimでも同じように機能するはずです。私はJavaとrubyで作業しているので、c#は本当に弱いです。

于 2012-08-03T16:01:06.317 に答える
0

例外をキャッチした場合は、それを使って何かを行う必要があります。たとえば、独自の例外をスローするだけの場合は、最後の例外のスタックトレースが失われます。

于 2012-08-03T08:16:17.170 に答える