質問

短い質問、なぜそうです Assert.AreEqual(1.0, double.NaN, 1.0) 合格?一方 Assert.AreEqual(1.0, double.NaN) 失敗します。

それはmstest(microsoft.visualstudio.qualitytools.unittestframework)のバグですか、それともここで何かが足りませんか?

よろしく、エギル。


更新:おそらく、私の質問の背後にある理由は、いくつかの線形代数マトリックス操作がNANまたは(+/-)Infinityであるために残念ながら合格した単位テストの束があることです。ユニットテストは問題ありませんが、実際のまたは/およびnanまたは無限である場合にデルタでダブルスのアラックアリークのダブルスが通過するため、私がテストしていたコードが正しいと信じさせられました。

役に立ちましたか?

解決

気をつけて。ナンは奇妙で、多くのDBMSでnullのようなものであり、値を(直接、またはassert.areequal)と比較するべきではありません。のドキュメントから double.nan:

ISNANを使用して、値が数ではないかどうかを判断します。値をNANに等しい別の値と比較することで、値が数値ではないかどうかを判断することはできません。

double zero = 0;
Console.WriteLine((0 / zero) == Double.NaN);  // prints false
Console.WriteLine(Double.IsNaN(0 / zero));  // prints true

何が起こっているのかを確認するには、アサートの内部(ダブル、ダブル、ダブル)を覗く必要がありますが、一般的に、NANに対する未定義の動作に依存します。

他のヒント

答えは時代遅れです。バグが修正された場合、いつ、どのバージョンでどのバージョンのアセンブリですか?

それは正しい、Microsoft.visualStudio.qualityTools.unittestframework.dllアセンブリ、バージョン10.0.0.0でVS2013で修正されました。レガシーGAC、C: Windows Assemblyに紹介されており、10.1.0.0バージョンもあります。

ここにはDLL Hellストーリーがあります。10.1.0.0バージョンはVS2010で使用されていました。バグがあり、double.nanを適切にチェックしていませんでした。 Microsoftは間違いを犯し、10.1.0.0を修正しましたが、バージョン番号は変更しませんでした。したがって、VS2010をインストールした人 VS2013のインストールは怪我をするでしょう、それはバギーバージョンでDLLを上書きするでしょう。

Dll Hellを解き明かすことは決してそれほど単純ではありませんが、 接続記事 そして、顧客の苦情から障害モードを特定したのは、私のマシンでの動作方法からです。更新で配信された修正を提供しました。どちらを明確ではありません。2014年7月以降は、v10.0.0.0を使用し、mstest.exeテストランナーを使用し、qtagentsには.configファイルがあります。 <bindingRedirect> それは10.1.0.0から10.0.0.0にリダイレクトされます(タイプミスではありません)。最新のアップデート、現在4を取得してください。インストールした更新がわからない場合は、ヘルプをご覧ください。

記録のために、固定コードはdouble.nanの特定のチェックを取得しました、それは次のようになります:

public static void AreEqual(double expected, double actual, double delta, string message, params object[] parameters)
{
    if ((double.IsNaN(expected) || double.IsNaN(actual)) || double.IsNaN(delta))
    {
        string str = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str, parameters);
    }
    if (Math.Abs((double) (expected - actual)) > delta)
    {
        string str2 = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str2, parameters);
    }
}

MSTESTは次の式を使用します Assert.AreEqual<double>(expected, actual, delta) 方法:

if (Math.Abs(expected - actual) > delta)
    Assert.HandleFail("Assert.AreEqual", ...)

操作が減少します double.NaN > delta, 、この場合は真実です。または未定義。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top