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.
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. –
"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ó. –
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. –