在尝试在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))
导致此测试正确失败.
这看起来太简单了,但我看不出这里出了什么问题.如果有人可以用我的方式指出错误,我会非常感激.
提前致谢,
麦克风
更新James Avery的回复:
啊,我现在感觉多么愚蠢.我知道它必须是这样的.哇.
果然,'GoToDefinition'将我带到'Object.ReferenceEquals()'.因此输入"Assert.ReferenceEquals()"实际上是System.Object.ReferenceEquals(),在我的情况下,它正在悄悄地返回'false'.当然,这与实际失败的断言无关,因此测试通过.惊人.
谢谢詹姆斯.
您调用的ReferenceEquals方法是所有引用对象上可用的静态方法,它不是测试框架的一部分.如果你看它返回一个布尔值,而正常的断言将是无效的.这绝对令人困惑,.AreSame()是你正在寻找的断言.