Assert.ReferenceEquals () Проходит, где Object.ReferenceEquals () возвращает false в тесте Visual Studio - PullRequest
22 голосов
/ 20 апреля 2009

При попытке создать начальный, не пройденный модульный тест в тестовых возможностях 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))

заставляет этот тест правильно завершиться неудачей.

Это кажется слишком простым, и все же я не вижу, что здесь происходит не так. Если кто-то может указать мне на ошибку, я был бы очень признателен.

Заранее спасибо,

Mike

Обновление от Джеймса Эвери:

Ах, как глупо я себя сейчас чувствую. Я знал что-то вроде этого. Вот это да.

Конечно, GoToDefinition переводит меня в Object.ReferenceEquals (). Таким образом, набрав «Assert.ReferenceEquals ()» на самом деле System.Object.ReferenceEquals (), который в моем случае тихо возвращал «ложь». Это, конечно, не имеет никакого отношения к фактическому провалу утверждения, поэтому тест проходит . Удивительно.

Спасибо, Джеймс.

1 Ответ

32 голосов
/ 20 апреля 2009

Метод ReferenceEquals, который вы вызываете, является статическим методом, доступным для всех ссылочных объектов, он не является частью инфраструктуры тестирования. Если вы посмотрите, он возвращает логическое значение, тогда как нормальное утверждение будет недействительным. Это определенно сбивает с толку, .AreSame () - это утверждение, которое вы ищете.

...