2011-10-17 36 views
8

Tôi có một lớp học, trong đó có một vài cấu trúc:Tại sao Assert.AreEqual (T obj1, Tobj2) thất bại với các đối tượng giống hệt nhau

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; } 
} 

Trong một thử nghiệm đơn vị tôi thực hiện một cuộc gọi chức năng và so sánh kết quả:

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); 

Nhưng Assert.AreEqual luôn ném AssertFailedException. Các đối tượng giống hệt nhau, tôi đã xác minh điều này bằng trình gỡ lỗi. Hãy chia sẻ bất kỳ ý tưởng nào. Cảm ơn.

+1

Vui lòng gắn thẻ bằng ngôn ngữ bạn đang sử dụng. – geoffspear

+1

Bạn đang sử dụng khung kiểm thử đơn vị nào? NUnit? MSTest? MbUnit? Thứ gì khác? (vui lòng cập nhật thẻ của bạn). – Steven

+2

Bạn đang so sánh cùng một đối tượng ở đây, bạn có chắc chắn rằng nó không thành công? –

Trả lời

6

Cuộc gọi Assert.AreEqual (dự kiến, dự kiến) không được thực hiện. Nếu bạn đã mắc sai lầm trong câu hỏi của mình và bạn có nghĩa là Assert.AreEqual (được mong đợi, thực tế) và HomeControllerHelper.GetNavigationMenuByUserRole của bạn trả về một phiên bản mới của NavigationMenu, thì cuộc gọi đến Assert.AreEqual luôn thất bại, gây ra loại của bạn NavigationMenu là một lớp và do đó là một kiểu tham chiếu, ngay cả khi bạn đặt thuộc tính của các cá thể thành các giá trị giống nhau.

Assert.AreEqual thực hiện kiểm tra bình đẳng nếu hai biến trỏ đến cùng một tham chiếu (aka. ReferenceEqual) và không nếu hai tham chiếu chứa cùng một giá trị (thuộc tính).

Bạn có thể ghi đè phương thức Bằng của lớp NavigationMenu để cung cấp triển khai tùy chỉnh nếu hai phiên bản của lớp của bạn bằng nhau.

+0

Trong ví dụ mà anh ta đưa ra, anh ấy so sánh cùng một biến. –

+0

Có lẽ anh ta có nghĩa là Assert.AreEqual (mong đợi, thực tế) để câu trả lời của bạn là chính xác –

+0

Nên được Assert.AreEqual (dự kiến, thực tế), xin lỗi vì nhầm lẫn, và cảm ơn rất nhiều cho câu trả lời. – Narek

3

Giả sử rằng nó phải được Assert.AreEqual(expected, actual);, như nó đã được staded trong ý kiến:

Bạn phải xác định làm thế nào để so sánh NavigationMenuItem đối tượng. Atm cheking duy nhất của nó nếu nó cùng một ví dụ và obviosly họ không phải như vậy asserty phải thất bại.

3

Vì bạn (có lẽ) so sánh hai trường hợp khác nhau của một đối tượng, nhưng với cùng các tham số. Để các đối tượng được "bằng nhau", bạn cần ghi đè phương thức Equals trên đối tượng và thực hiện so sánh ở đó.

+1

... và triển khai GetHashCode() – sll

Các vấn đề liên quan