【问题标题】:Why does Assert.AreEqual Fail on <Object, Object>? Type Mismatch?为什么 Assert.AreEqual 在 <Object, Object> 上失败?类型不匹配?
【发布时间】:2013-11-07 23:19:28
【问题描述】:

我正在尝试在测试中使用Assert.AreEqual 来验证来自我们提供商的 DTO。

断言失败:

预期: DTO.EmployeeDTO

实际: DataProviders.Mappers.EmployeeMapper

我可以用我们的 DTO 和/或映射器做些什么来让AreEqual 工作吗?我应该为 DTO 覆盖 Equals 并改用 Assert.Equal 吗?

这是我们预期的员工 DTO 以供比较:

EmployeeDTO expected = new EmployeeDTO
{
    Category = "OPS", 
    Code = "EMPL",
    Email = "bill.gates@microsoft.com",
    JobDescription = "Philanthropist",
    FirstName = "Bill",
    Bolander = "Gates",
    ResourceID = 1234567,
    ResourceNumber = "ABCD1234567",
    UserGUID = Guid.Parse("0A76A348-B709-9EF0-9E44-419433E7C90D"),
    UserName = "billygates"
};

这是我们来自数据提供者的调用,它应该返回一个EmployeeDTO,我们可以将其与我们预期的 DTO 进行比较。

 EmployeeDTO actual = controller.GetEmployee("billygates");

这是应该返回员工 DTO 的 GetEmployee 提供程序方法:

public EmployeeDTO GetEmployee(string userName)
{
    EmployeeDTO toReturn = null;

    //Get employee   
    toReturn = (from employees in Context.EmployeeTable
       where employees.UserName.Equals(userName)
       select new EmployeeMapper
       {
        MapToFullDTO = employees
       }
       ).SingleOrDefault<EmployeeDTO>();
}

请注意,MapToFullDTO 属性是名为 EmployeeMapper 的类的一部分,该类继承自 EmployeeDTO。为了方便起见,此属性填充基类的属性,因此我们不必每次都写出映射。我知道这是问题的一部分,但我不知道为什么。

【问题讨论】:

  • 我会在这里使用扩展方法语法,例如Context.EmployeeTable.Where(e =&gt; e.UserName.Equals(userName)) .Select(e =&gt; new EmployeeMapper { apToFullDTO = e }) to do not mess with Query Syntax. .SingleOrDefault&lt;EmployeeDTO&gt;().
  • 只是一个与您的问题完全无关的旁注,我是关于语法和样式的。您在 LINQ 查询中搞砸了两种语法:所谓的“查询”和“扩展方法”。为了可读性,最好坚持使用一个。

标签: c# .net unit-testing mstest assert


【解决方案1】:

您需要覆盖类上的Equals() 方法以根据属性值比较对象。

否则比较会比较明显不同的对象的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2018-12-11
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2019-09-29
    相关资源
    最近更新 更多