【问题标题】:Simple `Assert.IsAssignableFrom<T>` failing简单的 `Assert.IsAssignableFrom<T>` 失败
【发布时间】:2011-04-06 01:14:34
【问题描述】:

为什么这个简单的断言语句会失败?从我所读到的,我应该是。不幸的是,由于功能非常基本,所以没有太多信息。

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>

我曾尝试交换界面和对象端,但无济于事。

【问题讨论】:

    标签: c# unit-testing nunit


    【解决方案1】:

    IsAssignableFrom 与您的预期相反。它在问:(值)是否可以从 IDummy 分配。或者:“可分配给(值)吗?”

    来自 XML 文档: /// 断言可以为对象分配给定类型的值。

    你可能想要 Assert.IsInstanceOfType()

    【讨论】:

    • 啊,那行得通。谢谢。那么IsAssignableFrom的目的是什么?
    • @gsco,请看下面我的回答
    【解决方案2】:

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

    Assert.IsAssignableFrom&lt;T&gt;(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&lt;T&gt;(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);   
    }
    

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

    【讨论】:

    • 因此,在 Mark Seeman 的 PluralSight 课程中,他使用了 xUnit。有一个类定义为public class SimpleWebToken : IEnumerable&lt;Claim&gt; {...}。然后,在他的 xUnit 测试中,他有Assert.IsAssignableFrom&lt;IEnumerable&lt;Claim&gt;&gt;(sut)(其中sutSimpleWebToken 的一个实例)。并且这个测试通过了!但无论如何,它应该会失败。当对 NUnit 使用完全相同的断言时,测试失败。而且,运行 var good = SimpleWebToken.GetType().IsAssignableFrom(typeof(IEnumerable&lt;Claim&gt;)); // good = false 给了我预期的 false 结果。嗯,我对测试框架失去了信心。
    • 没关系。 xUnit 正在做一些时髦但很酷的事情,因为它模仿了您在 BCL 中使用 System.Type.IsAssignableFrom(Type) 方法的方式。另一方面,NUnit 有约束方法IsAssignableFromIsAssignableTo,它们是从 BCL 倒过来的。所以,当使用反射时,你会使用IsAssignableFrom,但在NUnit 中编写断言时,你会使用Is.AssignableTo&lt;TType&gt;() 约束。令人困惑。
    • @fourpastmidnight 这些天我喜欢使用美妙的Shoudly 断言库,我可以将断言简化为someInstance.ShouldBeOfType&lt;TExtpected&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2012-11-17
    • 2019-03-07
    • 2020-10-29
    • 2022-01-19
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多