views:

405

answers:

1

In attempting to create an initial, failing unit test in Visual Studio Professonal 2008's test capabilities, I can't seem to get Assert.ReferenceEquals() to correctly fail when an object instance is not equal to a null reference. Note that object.ReferenceEquals() is correctly returning false for this same comparison.

Here is my class code:

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

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

And then here are the key aspects of my test class:

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

Note that the static void Startup(object) method is empty, so the static object TheObject property is never set and remains null. So, clearly, Assert.ReferenceEquals(obj, Project.TheObject) should fail, but somehow this test passes.

Note that changing

Assert.ReferenceEquals(obj, Project.TheObject)

to

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

causes this test to correctly fail.

This seems too simple, and yet I cannot see what's going wrong here. If someone can point out the error in my ways, I would be much obliged.

Thanks in advance,

Mike

Update Answered by James Avery:

Ah, an how silly I feel now. I knew it had to be something like this. Wow.

Sure enough, 'GoToDefinition' takes me to 'Object.ReferenceEquals()'. So typing "Assert.ReferenceEquals()" is really System.Object.ReferenceEquals(), which in my case was quietly returning 'false'. This, of course, has nothing to do with actually failing an assertion, so the test passes. Amazing.

Thanks James.

+6  A: 

The ReferenceEquals method you are calling is the static method available on all reference objects, it is not part of the testing framework. If you look it is returning a boolean value whereas a normal assertion would be void. This is definitely confusing, .AreSame() is the assertion you are looking for.

James Avery
Ah, an how silly I feel now. I *knew* it had to be something like this. Wow. Sure enough, 'GoToDefinition' takes me to 'Object.ReferenceEquals()'.So typing "Assert.ReferenceEquals()" is really Object.ReferenceEquals(), which in my case was quietly returning 'false' -- which, of course, has nothing to do with actually failing an assertion. So the test **passes**. Amazing. Thanks James.
Mike Rosenblum