2011-10-17 1 views
8

失敗私はいくつかの構造体を含むクラス有する:ユニットテストにおいてなぜAssert.AreEqualは(TのOBJ1、Tobj2)が同じオブジェクトと

public class NavigationMenu 
{ 
    public struct NavigationMenuItem 
    { 
     public bool Enabled { get; set; } 
     public int NumberOfPendingOperations { get; set; } 
    } 

    public NavigationMenuItem SubmitExpenses { get; set; } 
    public NavigationMenuItem ManageExpenses { get; set; } 
    public NavigationMenuItem SubmitBudgets { get; set; } 
    public NavigationMenuItem ManageBudgets { get; set; } 
    public NavigationMenuItem AuthorizeExpenses { get; set; } 
    public NavigationMenuItem ApproveExpenses { get; set; } 
    public NavigationMenuItem PayExpenses { get; set; } 
    public NavigationMenuItem BillExpenses { get; set; } 
    public NavigationMenuItem ManageReturnedExpenses { get; set; } 
    public NavigationMenuItem ManageIncompleteExpenses { get; set; } 
    public NavigationMenuItem ManageOrders { get; set; } 
    public NavigationMenuItem ApproveBudgets { get; set; } 
    public NavigationMenuItem AdministrateSystem { get; set; } 
} 

をIは、関数呼び出しを行い、結果を比較:

NavigationMenu expected = new NavigationMenu(); 
     expected.SubmitExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true }; 
     expected.ManageExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true }; 

     NavigationMenu actual = HomeControllerHelper.GetNavigationMenuByUserRole(userRole); 

     Assert.AreEqual(expected, actual); 

しかし、Assert.AreEqualは常にAssertFailedExceptionをスローします。オブジェクトは同じですが、デバッガを使用してこれを検証しました。アイデアを教えてください。ありがとう。

+1

使用している言語でタグを付けてください。 – geoffspear

+1

どのユニットテストフレームワークを使用していますか? NUnit? MSTest? MbUnit?他に何か? (あなたのタグを更新してください)。 – Steven

+2

ここで同じオブジェクトを比較していますが、失敗している可能性はありますか? –

答えて

6

コールAssert.AreEqual(expected、expected)は失敗しません。あなたの質問に間違いがあり、あなたがをAssert.AreEqual(実際の)と仮定した場合、とHomeControllerHelper.GetNavigationMenuByUserRoleがNavigationMenuの新しいインスタンスを返した場合、Assert.AreEqualの呼び出しは常に失敗し、NavigationMenuのタイプがたとえインスタンスのプロパティーを同じ値に設定したとしても、参照型になります。

Assert.AreEqualは、2つの変数が同じ参照(別名ReferenceEqual)を指していて、2つの参照に同じ(プロパティ)値が含まれているかどうかを確認しません。

クラスの2つのインスタンスが等しい場合、カスタム実装を提供するためにNavigationMenuクラスのEqualsメソッドをオーバーライドできます。

+0

彼が与えた例では、彼は同じ変数を比較しています。 –

+0

おそらく彼はAssert.AreEqual(予想、実際)を意味すると思われるので、あなたの答えは正しい –

+0

Assert.AreEqual(期待、実際)であり、混乱のために申し訳ありません。 – Narek

3

それはコメントでstadedたように、それは、Assert.AreEqual(expected, actual);あるべきと仮定すると:あなたはNavigationMenuItemオブジェクトを比較する方法を定義する必要が

。 Atmは、同じインスタンスとobviosly彼らは断言していない場合は失敗する必要がある場合にのみ鳴る。

3

オブジェクトの2つの異なるインスタンスを(おそらく)比較しているが、同じパラメータを使用しているためです。オブジェクトが "等しい"ようにするには、オブジェクトのEqualsメソッドをオーバーライドし、そこで比較を実装する必要があります。

+1

... GetHashCode()も実装します – sll

関連する問題