9

ブロックAssertに引っかかるという興味深い動作に遭遇しました。Catch

List<Decimal> consArray = new List<decimal>();
try
{
    Decimal d;
    Assert.IsTrue(Decimal.TryParse(item.Value, out d));
    consArray.Add(d);
}
catch (Exception e)
{
     Console.WriteLine(item.Value);
     Console.WriteLine(e);
}

スローAssertFailedExceptionをアサートし、 によってキャッチされcatchます。Assert失敗するとテストが失敗し、連続実行が中止されると常に考えていました。しかし、その場合 - テストは進みます。後で何も問題がなければ、グリーンテストを取得します。理論的には - それは正しい行動ですか?

編集済み:おそらく.NETの制限であり、MsTestでアサートがどのように行われるかを理解しています。アサートは例外をスローします。以降catch- アサート例外をキャッチするすべてをキャッチします。しかし、それは理論的に正しいのでしょうか、それとも MsTest 固有のものでしょうか?

4

3 に答える 3

6

すでに回答されているように、これは正しい動作です。AssertFailedExceptionをキャッチして再スローすることにより、コードを変更して期待される動作を得ることができます。

        List<Decimal> consArray = new List<decimal>();
        try
        {
            Decimal d;
            Assert.IsTrue(Decimal.TryParse(item.Value, out d));
            consArray.Add(d);
        }
        catch (AssertFailedException)
        {
            throw;
        }

        catch (Exception e)
        {
            Console.WriteLine(item.Value);
            Console.WriteLine(e);
        }
于 2013-02-15T09:48:48.950 に答える
5

あなたのコードは期待どおりに動作しています。がAssert失敗すると、 Exceptionから継承するAssertFailedExceptionをスローします。したがって、 a を追加してキャッチできます。try-catch

あなたの場合、throw末尾にa を追加してcatch、例外を再スローします。

于 2013-02-15T07:14:52.810 に答える
5

NUnitまったく同じことをします。私が考える他のテストフレームワークと同様に、私は C# でMStestしか知りません。NUnit

テスト コードには が含まれていないと思いDecimal.TryParseますが、ビジネス ロジックはそれを行い、オブジェクトとメソッド呼び出しでテストします。

何かのようなもの:

var sut = new Sut();
var d = sut.DoSomethingThatReturnsTheDecimal(item.Value);

Assert.AreEqual(0.123, d, string.Format("passed value can not be parsed to decimal ({0})", item.Value);

実装に少し近づくために:

List<Decimal> consArray = new List<decimal>();

Decimal d = Decimal.MinValue;

// You don't need to try-catch a Decimal.TryParse
// Decimal.TryParse(item.Value, out d));

try
{
    d = Decimal.Parse(item.Value)
}
catch
{
    // Handle exception
}

Assert.AreEqual(0.123, d);

// Does the list add anything at all? In this sample it seems a bit redundant
consArray.Add(d);

とにかく、あなたの質問に答えるために。try-catch は、あなたのAssertFailedException.

PS: をキャッチしAsserFailedExceptionて再スローすることもできますが、少し奇妙に感じます。s をブロックAssertの外に残すように努めます。try-catchしかし、それはあなたが求めていない私の意見かもしれません:)。

于 2013-02-15T09:27:39.817 に答える