2009-04-19 33 views
22

Khi cố gắng tạo một thử nghiệm đơn vị ban đầu, không thành công trong khả năng kiểm tra của Visual Studio Professonal 2008, tôi dường như không thể nhận được Assert.ReferenceEquals() thất bại chính xác khi một cá thể đối tượng là không phải là bằng tham chiếu null. Lưu ý rằng object.ReferenceEquals() đang trả lại chính xác false cho cùng một so sánh này.Assert.ReferenceEquals() Trả về nơi Object.ReferenceEquals() trả về 'false' trong Visual Studio Test

Đây là mã lớp học của tôi:

public static class Project 
{ 
    public static object TheObject { get; set; } 

    public static void Startup(object theObject) 
    { 
     // ToDo: Project.Startup(): Test. 
     // ToDo: Project.Startup(): Implement. 
    } 
} 

Và sau đó đây là những khía cạnh quan trọng của lớp thử nghiệm của tôi:

[TestClass()] 
public class ProjectTest 
{ 
    [TestMethod()] 
    public void StartupTest() 
    { 
     object obj = "hello"; 
     Project.Startup(obj);  
     Assert.ReferenceEquals(obj, Project.TheObject); // Test Passes!?! 
    } 
} 

Lưu ý rằng phương pháp static void Startup(object) rỗng, vì vậy static object TheObject tài sản là không bao giờ đặt và giữ nguyên null. Vì vậy, rõ ràng, Assert.ReferenceEquals(obj, Project.TheObject) sẽ thất bại, nhưng bằng cách nào đó thử nghiệm này vượt qua.

Lưu ý rằng việc thay đổi

Assert.ReferenceEquals(obj, Project.TheObject)

để

Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))

nguyên nhân kiểm tra này để đúng thất bại.

Điều này có vẻ quá đơn giản, nhưng tôi không thể thấy điều gì đang xảy ra ở đây. Nếu ai đó có thể chỉ ra lỗi theo cách của tôi, tôi sẽ có nhiều nghĩa vụ.

Cảm ơn trước,

Mike

Cập nhật Giải đáp của James Avery:

Ah, một cách ngớ ngẩn tôi cảm thấy bây giờ. Tôi biết nó phải là một cái gì đó như thế này. Wow.

Chắc chắn đủ, 'GoToDefinition' đưa tôi đến 'Object.ReferenceEquals()'. Vì vậy, gõ "Assert.ReferenceEquals()" thực sự là System.Object.ReferenceEquals(), mà trong trường hợp của tôi đã lặng lẽ trả về 'false'. Điều này, tất nhiên, không có gì để làm với thực sự không một khẳng định, do đó, kiểm tra vượt qua. Kinh ngạc.

Cảm ơn James.

+0

Tôi vừa bị trúng sai lầm ngớ ngẩn này. Đó là một cái bẫy dễ dàng rơi vào. Có vẻ như các lớp kiểm tra đơn vị ít nhất có thể ném lên một cảnh báo nếu không có Assertions thực tế nào được gọi. Điều đó ít nhất sẽ nắm bắt các trường hợp rất đơn giản như mã mẫu của bạn ở trên và kiểm tra đặc tính cụ thể mà tôi đã cố gắng thực hiện. –

+0

"Có vẻ như các lớp kiểm tra đơn vị ít nhất có thể ném lên một cảnh báo nếu không có Assertions thực tế được gọi." <- Đó là một ý tưởng khá thú vị và không chỉ để bảo vệ chống lại cái bẫy ngớ ngẩn này. Tôi thích nó. –

+2

Một ý tưởng tốt hơn, mặc dù, sẽ là cho lớp Assert để tạo ra một phương thức tĩnh mới gọi là 'ReferenceEquals' sẽ làm bóng phương thức 'Object.ReferenceEquals' và sau đó đánh dấu phương thức đó với ObsoleteAttribute với thông báo lỗi thích hợp. Bằng cách này, người dùng sẽ được cảnh báo nếu họ mắc lỗi này. –

Trả lời

30

Phương thức ReferenceEquals bạn đang gọi là phương thức tĩnh có sẵn trên tất cả các đối tượng tham chiếu, nó không phải là một phần của khung kiểm thử. Nếu bạn nhìn nó trả về giá trị boolean trong khi xác nhận thông thường sẽ bị vô hiệu. Điều này chắc chắn gây nhầm lẫn, .AreSame() là xác nhận bạn đang tìm kiếm.

+1

Ah, tôi cảm thấy ngớ ngẩn đến mức nào. Tôi * biết * nó phải là một cái gì đó như thế này. Wow. Chắc chắn, 'GoToDefinition' đưa tôi đến 'Object.ReferenceEquals()'. Vì vậy, gõ "Assert.ReferenceEquals()" thực sự là Object.ReferenceEquals(), mà trong trường hợp của tôi đã lặng lẽ trở về 'false' - mà, tất nhiên, không có gì để làm với thực sự thất bại một khẳng định. Vì vậy, các thử nghiệm ** đi **. Kinh ngạc. Cảm ơn James. –

+1

Tôi chạy vào vấn đề tương tự và NUnit ném một ngoại lệ cho thấy không sử dụng ReferenceEquals để xác nhận. Tôi đã thay đổi nó thành Assert.AreSame() như bạn đã gợi ý. Họ rõ ràng đã vượt qua Assert.ReferenceEquals() để ném một ngoại lệ, nhưng tại sao không ghi đè lên chức năng để làm những gì chúng ta mong đợi? –

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