Visual Studio Professonal 2008のテスト機能で初期の失敗する単体テストを作成しようとすると、Assert.ReferenceEquals()
を取得できないようですオブジェクトインスタンスがでない場合に正しく失敗します。はnull参照と同じです。この同じ比較のためにobject.ReferenceEquals()
が正しくfalse
を返すことに注意してください。 static object TheObject
プロパティは決してありませんので、static void Startup(object)
方法が空であることをAssert.ReferenceEquals()Visual StudioのテストでObject.ReferenceEquals()が 'false'を返す場合
[TestClass()]
public class ProjectTest
{
[TestMethod()]
public void StartupTest()
{
object obj = "hello";
Project.Startup(obj);
Assert.ReferenceEquals(obj, Project.TheObject); // Test Passes!?!
}
}
注:
public static class Project
{
public static object TheObject { get; set; }
public static void Startup(object theObject)
{
// ToDo: Project.Startup(): Test.
// ToDo: Project.Startup(): Implement.
}
}
そして、ここに私のテストクラスの重要な側面は、次のとおりです。ここ
は私のクラスのコードです設定して残りますnull
。だから、明らかに、
Assert.ReferenceEquals(obj, Project.TheObject)
は失敗するはずですが、何とかこのテストに合格します。
正しくに
Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))
原因このテストに
Assert.ReferenceEquals(obj, Project.TheObject)
を変更
注意は失敗します。
これは単純すぎるようですが、ここで何がうまくいかないのか分かりません。誰かが私の方法でエラーを指摘することができれば、私は多くの義務があります。事前に
おかげで、
マイク・ジェームズ・エイブリーによって回答
更新:
ああ、私は今、どのように感じるか愚かな。私はが知っていたそれはこのようなものでなければならなかった。ワオ。
確かに、 'GoToDefinition'は 'Object.ReferenceEquals()'に移動します。したがって、 "Assert.ReferenceEquals()"と入力するとSystem.Object.ReferenceEquals()となり、私の場合は静かに「false」を返しています。これは、もちろん、実際にアサーションに失敗したこととは関係がないので、テストはになります。素晴らしい。
ありがとうございました。
私はちょうどこの同じばかげた間違いでヒットしました。それは落ちるような簡単な罠です。実際のアサーションが呼び出されなければ、ユニットテストクラスは少なくとも警告をスローすることができるようです。上記のサンプルコードのような非常に単純なケースと私が達成しようとしていた特定のプロパティチェックを少なくとも捕らえるでしょう。 –
"ユニットテストクラスは、実際のアサーションが呼び出されなかった場合に警告を出すことができるようです。" < - これはかなり興味深い考えで、このばかげた罠から守るだけではありません。私はそれが好きです。 –
しかし、Assertクラスでは、 'ReferenceEquals'という新しい静的メソッドを作成して 'Object.ReferenceEquals'メソッドをシャドウし、そのメソッドにObsoleteAttributeを適切なエラーメッセージでマークしておくとよいでしょう。このようにして、ユーザーはこのミスを犯したかどうか警告されます。 –