23

在尝试在 Visual Studio Professonal 2008 的测试功能中创建初始失败的单元测试时,当对象实例等于空引用时,我似乎Assert.ReferenceEquals()无法正确失败。请注意,对于相同的比较,它正确返回。object.ReferenceEquals()false

这是我的课程代码:

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

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

然后这里是我的测试课的关键方面:

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

请注意,该static void Startup(object)方法是空的,因此该static object TheObject属性永远不会设置并保持不变null。所以,显然,Assert.ReferenceEquals(obj, Project.TheObject)应该失败,但不知何故,这个测试通过了。

注意改变

Assert.ReferenceEquals(obj, Project.TheObject)

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

导致此测试正确失败。

这似乎太简单了,但我看不出这里出了什么问题。如果有人能以我的方式指出错误,我将不胜感激。

提前致谢,

麦克风

詹姆斯艾弗里回答的更新:

啊,我现在感觉多么愚蠢。我知道它必须是这样的。哇。

果然,“GoToDefinition”将我带到“Object.ReferenceEquals()”。所以键入“Assert.ReferenceEquals()”实际上是 System.Object.ReferenceEquals(),在我的例子中它悄悄地返回“false”。当然,这与实际失败的断言无关,因此测试通过。惊人的。

谢谢詹姆斯。

4

1 回答 1

35

您调用的 ReferenceEquals 方法是所有引用对象上可用的静态方法,它不是测试框架的一部分。如果你看它返回一个布尔值,而正常的断言将是无效的。这绝对令人困惑, .AreSame() 是您正在寻找的断言。

于 2009-04-19T23:54:26.563 回答