Простой `Assert.IsAssignableFrom <T>` сбой - PullRequest
8 голосов
/ 06 апреля 2011

Почему это простое утверждение assert не выполняется? Из того, что я прочитал, я должен быть. К сожалению, поскольку функциональность так проста, информации не так много.

public interface IDummy{}
public class Dummy : IDummy {}

Assert.IsAssignableFrom<IDummy>(new Dummy());

Выполнение этого теста дает

Expected: assignable from <Application.Tests.ViewModels.IDummy>
  But was:  <Application.Tests.ViewModels.Dummy>

Я попытался поменять местами интерфейс и объекты безрезультатно.

Ответы [ 2 ]

11 голосов
/ 06 апреля 2011

IsAssignableFrom работает в обратном направлении от того, что вы ожидаете. Он спрашивает: является (значение) назначаемым из IDummy. Или: «Назначается (значение)?»

Из документа XML: /// Утверждает, что объекту может быть присвоено значение данного Типа.

Возможно, вы хотите Assert.IsInstanceOfType ()

3 голосов
/ 12 февраля 2015

В пользу тех, кто приземляется здесь через Google (или Bing :-))

Assert.IsAssignableFrom<T>(object actual) предназначено для проверки того, может ли исследуемый объект быть заменен типом T. Фактически это означает, что утверждение проверяет взаимосвязь «есть» между исследуемым объектом и типом T.

Давайте посмотрим некоторый код (намеренно упрощенный):

// The Base class
public class Employee
{
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfJoining { get; set; }
}

// The derived class
public class Manager : Employee
{
    public IList<Employee> EmployeesReporting { get; set; }
}

Теперь утверждение:

// NOTE: using Assert = NUnit.Framework.Assert;
[TestMethod]
public void Test_IsAssignableFrom()
{
    var employee = new Employee();

    // Manager is-a Employee, so the below is true
    Assert.IsAssignableFrom<Manager>(employee);    
}

Принимая во внимание, что IsInstanceOf<T>(object actual) предназначен для проверки того, является ли тестируемый объект (как следует из названия) экземпляром типа T - проще говоря, если «фактическим» является тип T или тип, производный от T

[TestMethod]
public void Test_IsAssignableFrom()
{
    var manager = new Manager();

    // Manager derives from Employee so the below is true
    Assert.IsInstanceOf<Employee>(manager);   
}

EDIT Оказывается, эти утверждения работают так же, как методы Type.IsAssignableFrom и Type.IsInstanceOf в System.Type

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...