C# 单元测试默认断言方法?

C# 单元测试默认断言方法?,c#,unit-testing,assertions,C#,Unit Testing,Assertions,我通过比较dto和模型对象来进行断言。如下:- Assert.AreEqual(_oCustomer.FKCustomerId, actual.FKCustomerId); Assert.AreEqual(_oCustomer.Name,actual.Name); Assert.AreEqual(_oCustomer.Description,actual.Description); 但是我想,我们可以为每个测试方法提供任何默认/自动功能,而不是为每个测试方法中的每个属性进行断言吗?谁能给我指

我通过比较dto和模型对象来进行断言。如下:-

Assert.AreEqual(_oCustomer.FKCustomerId, actual.FKCustomerId);
Assert.AreEqual(_oCustomer.Name,actual.Name);
Assert.AreEqual(_oCustomer.Description,actual.Description); 

但是我想,我们可以为每个测试方法提供任何默认/自动功能,而不是为每个测试方法中的每个属性进行断言吗?谁能给我指点一下吗

在不污染模型和/或名称空间的情况下,通过覆盖Equals将模型与DTO进行比较,您只需创建一个执行比较的方法,并在每个测试中调用它。现在,您仍然可以逐个属性进行断言,这样您就可以准确地看到哪一个正在破坏测试,但您只需要在一个地方更改它

public static class ModelDtoComparer
{
    public static void AssertAreEqual(Model model, Dto dto)
    {
        Assert.AreEqual(model.FKCustomerId, dto.FKCustomerId);
        Assert.AreEqual(model.Name, dto.Name);
        Assert.AreEqual(model.Description, dto.Description);
        // etc.
    }
}
评论回应 要对列表执行此操作,其中modelList应与项的dtoList项匹配:

Assert.AreEqual(modelList.Length, dtoList.Length);

for (var i = 0; i < modelList.Length; i++)
{
    ModelDtoComparer.AssertAreEqual(modelList[i], dtoList[i]);
}

如果需要,您可以使用反射,这里有一个通用方法,您可以用来比较任何两个您想要的对象,无论它们是什么类型:

public void CompareMyObjects(object object1, object object2)
{
    var type1Fields = object1.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
    var type2Fields = object2.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);

    var propsInCommon = type1Fields.Join(type2Fields, t1 => t1.Name, t2 => t2.Name, (t1, t2) => new { frstGetter = t1.GetGetMethod(), scndGetter = t2.GetGetMethod() });

    foreach (var prop in propsInCommon)
    {
        Assert.AreEqual(prop.frstGetter.Invoke(object1, null), prop.scndGetter.Invoke(object2, null));
    }
}
您可以使用以下方法:

CompareMyObjects(actualCustomer, _oCustomer);
CompareMyObjects(actualAccount, _account);

我希望这会有所帮助。

您可以使用反射编写某种比较器。这将仅比较给定两个对象的Level1属性公共属性:

static void AssertAreEqual<T1, T2>(T1 instance1, T2 instance2) {
  var properties1 = typeof(T1).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
  var properties2 = typeof(T2).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);

  var properties = from p1 in properties1 
                   join p2 in properties2  on
                     p1.Name equals p2.Name
                   select p1.Name;
  foreach (var propertyName in properties) {
    var value1 = properties1.Where(p => p.Name == propertyName).First().GetGetMethod().Invoke(instance1, null);
    var value2 = properties2.Where(p => p.Name == propertyName).First().GetGetMethod().Invoke(instance2, null);
    Assert.AreEqual(value1, value2);
  }
}

public class PersonDto {
  public string LastName { get; set; }
  public int FieldFoo { get; set; }
  public int Dto { get; set; }
}

public class PersonModel {
  public string LastName { get; set; }
  public int FieldFoo { get; set; }
  public int Model { get; set; }
}

var p1 = new PersonDto { LastName = "Joe" };
var p2 = new PersonModel { LastName = "Joe" };
AssertAreEqual(p1, p2);

你试过什么?尝试在您喜爱的web搜索引擎中键入C对象相等。如果你有合适的相等比较器,你可以使用Assert.AreEqual\u oCustomer,actual。Jay我如何将其用于对象列表to list和model list?@Pawan这些列表应该是相等的,一个项目一个项目?那么,DTO列表中的第10项应该等于模型列表中的第10项?是的,我正在模拟对象,这样它将返回我们想要的或将传递到返回方法中的相同列表。谢谢@Jay……Jay,我还有一些事情要做。我想知道返回void方法的单元测试的最佳示例。