简单的Assert.IsAssignableFrom失败

本文关键字:失败 IsAssignableFrom Assert 简单 | 更新日期: 2023-09-27 17:48:59

为什么这个简单的断言语句失败了?据我所知,我应该是。不幸的是,由于功能是如此基本,所以没有太多的信息。

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>

我已经尝试过交换接口和对象端,但无济于事。

简单的Assert.IsAssignableFrom<T>失败

IsAssignableFrom的工作方式与您期望的相反。它问的是:(值)是否可以从IDummy中分配。或者:"是否可分配给(值)?"

从XML文档:///断言一个对象可以被赋给给定类型的值。

你可能想要Assert.IsInstanceOfType()

为了那些通过Google(或Bing)登陆这里的人的利益:-)

Assert.IsAssignableFrom<T>(object actual)意味着检查被检查的对象是否可以被类型t替代。实际上,这意味着断言正在测试被检查的对象和类型t之间的"is-a"关系。

让我们看一些代码(有意简化):

// 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的实例——简单地说,如果"actual"是类型T或从T派生的类型

[TestMethod]
public void Test_IsAssignableFrom()
{
    var manager = new Manager();
    // Manager derives from Employee so the below is true
    Assert.IsInstanceOf<Employee>(manager);   
}

编辑事实证明,这些断言的工作方式与Type相同。IsAssignableFrom和Type。IsInstanceOf方法。类型