2014-03-27 121 views
1

我做DTO的的比较和模型object.Like该做的断言: -单元测试默认声明方法?

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

但我想,而不是在每一个测试方法,我们可以对任何默认/自动功能做断言为每个属性它呢?任何人都可以指导我吗?

+1

你试过了什么?尝试在您喜欢的网页搜索引擎中输入“C#对象相等”。如果您有适当的相等比较器,您可以执行'Assert.AreEqual(_Customer,actual)'。 – CodeCaster

回答

1

如果不通过重写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]); 
} 
+0

杰伊我怎么能用这个对象列表(Dto列表和模型列表)? – Pawan

+0

@Pawan预计列表是否与项目对应项目相同?那么,DTO列表中的第10个项目应该等于模型列表中的第10个项目? – Jay

+0

是的,我嘲笑的对象,所以它会返回相同的列表,我们将要或将传递到返回方法。 – Pawan

0

,如果你愿意,你可以使用反射,这里是一个通用方法,您可以使用它比较任何两个对象,无论它们是什么类型:

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); 

我希望帮助。

1

你可以使用反射来写某种比较器。这将比较给定两个对象(仅适用于公共属性)的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);