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”的位置的主要内容,如果未能解决你的问题,请参考以下文章