2009-04-19 9 views
22

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」を返しています。これは、もちろん、実際にアサーションに失敗したこととは関係がないので、テストになります。素晴らしい。

ありがとうございました。

+0

私はちょうどこの同じばかげた間違いでヒットしました。それは落ちるような簡単な罠です。実際のアサーションが呼び出されなければ、ユニットテストクラスは少なくとも警告をスローすることができるようです。上記のサンプルコードのような非常に単純なケースと私が達成しようとしていた特定のプロパティチェックを少なくとも捕らえるでしょう。 –

+0

"ユニットテストクラスは、実際のアサーションが呼び出されなかった場合に警告を出すことができるようです。" < - これはかなり興味深い考えで、このばかげた罠から守るだけではありません。私はそれが好きです。 –

+2

しかし、Assertクラスでは、 'ReferenceEquals'という新しい静的メソッドを作成して 'Object.ReferenceEquals'メソッドをシャドウし、そのメソッドにObsoleteAttributeを適切なエラーメッセージでマークしておくとよいでしょう。このようにして、ユーザーはこのミスを犯したかどうか警告されます。 –

答えて

30

呼び出すReferenceEqualsメソッドは、すべての参照オブジェクトで使用できる静的メソッドです。テストフレームワークの一部ではありません。あなたが見ると、それはブール値を返すのに対し、通常のアサーションは無効になります。これは間違いなく混乱します.AreSame()はあなたが探している主張です。

+1

ああ、私は今どのように愚かな感じ。私は知っていた*それはこのようなものでなければならなかった。ワオ。確かに、 'GoToDefinition'は私を 'Object.ReferenceEquals()'に連れて行きます。 "Assert.ReferenceEquals()"と入力すると実際はObject.ReferenceEquals()となり、私の場合は静かに 'false'を返しています。もちろん、実際にはアサーションに失敗したことはありません。テスト**は**合格です。素晴らしい。感謝ジェームス。 –

+1

私は同様の問題に遭遇し、NUnitは、アサーションに対してReferenceEqualsを使用しないことを示す例外をスローします。私はAssert.AreSame()に変更しました。彼らは明らかに例外をスローするためにAssert.ReferenceEquals()をオーバーライドしましたが、期待したことをするために関数をオーバーライドしないのはなぜですか? –

関連する問題