Assert.ReferenceEquals() 在 Visual Studio 测试中传递 Object.ReferenceEquals() 返回“false”的位置

Posted

技术标签:

【中文标题】Assert.ReferenceEquals() 在 Visual Studio 测试中传递 Object.ReferenceEquals() 返回“false”的位置【英文标题】:Assert.ReferenceEquals() Passes where Object.ReferenceEquals() returns 'false' in Visual Studio Test 【发布时间】:2010-10-20 11:02:03 【问题描述】:

在尝试在 Visual Studio Professional 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))

导致此测试正确失败。

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

提前致谢,

迈克

James Avery 回答的更新:

啊,我现在感觉有多傻。我知道它必须是这样的。哇。

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

谢谢詹姆斯。

【问题讨论】:

我刚刚犯了同样的愚蠢错误。这是一个很容易掉入的陷阱。如果没有调用实际的断言,单元测试类似乎至少会发出警告。这至少可以捕捉到非常简单的情况,比如上面的示例代码和我试图完成的特定属性检查。 “如果没有调用实际的断言,单元测试类似乎至少会发出警告。” 不过,一个更好的主意是让 Assert 类创建一个名为“ReferenceEquals”的新静态方法,该方法将隐藏“Object.ReferenceEquals”方法,然后使用 ObsoleteAttribute 标记该方法适当的错误信息。这样,如果用户犯了这个错误,就会收到警告。 【参考方案1】:

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

【讨论】:

啊,我现在感觉好傻。我知道它必须是这样的。哇。果然,“GoToDefinition”将我带到“Object.ReferenceEquals()”。所以键入“Assert.ReferenceEquals()”实际上是 Object.ReferenceEquals(),在我的例子中它悄悄地返回“false”——当然,这与实际失败的断言无关。所以测试通过。惊人的。谢谢詹姆斯。 我遇到了类似的问题,NUnit 抛出一个异常,指示不要使用 ReferenceEquals 进行断言。我按照您的建议将其更改为 Assert.AreSame() 。他们显然重写了 Assert.ReferenceEquals() 来抛出异常,但为什么不重写函数来做我们期望的事情呢?

以上是关于Assert.ReferenceEquals() 在 Visual Studio 测试中传递 Object.ReferenceEquals() 返回“false”的位置的主要内容,如果未能解决你的问题,请参考以下文章