2016-06-08 5 views
3

Я делаю сравнения по базам данных (около 20 полей), и я определил конкретный тип для сравнения.Цитирование через элементы определенного бетонного типа?

Если мое сравнение не удалось, я хочу прокрутить отдельные элементы в блоке catch и предоставить пользователю ошибки списка. Ниже я сделал это вручную с помощью первых нескольких переменных. Есть ли более эффективный способ сделать это через все 20 полей? Я начал с Еогеасп (Object objectItem .. но не уверен, что это правильный путь

Любые мысли или столь необходимые указания

 try { 

     CollectionAssert.IsSubsetOf(orgs, members, "Error Matching testlist Fields"); 

      } 

     catch 
     { 
      //OrgID 
      var sourceOrgID = orgs.Select(o => o.OrgID); 
      var destOrgID = members.Select(o => o.OrgID); 
      var errorList1 = sourceOrgID.Except(destOrgID); 
      string failedTests = null; 
      failedTests = string.Join("\n", errorList1); 
      Assert.IsTrue(0 == failedTests.Length, "The following Org IDs are not contained in the source: \n" + failedTests); 

      //DealerCode 
      var sourceDealerCode = orgs.Select(o => o.DealerCode); 
      var destDealerCode = members.Select(o => o.DealerCode); 
      var errorList2 = sourceDealerCode.Except(destDealerCode); 
      failedTests = null; 
      failedTests = string.Join("\n", errorList2); 
      Assert.IsTrue(0 == failedTests.Length, "The following Dealer Codes are not contained in the source: \n" + failedTests); 


      //orgkey 
      var sourceOrgKey = orgs.Select(o => o.OrgKey); 
      var destOrgKey = members.Select(o => o.OrgKey); 
      var errorList3 = sourceOrgKey.Except(destOrgKey); 
      failedTests = null; 
      failedTests = string.Join("\n", errorList3); 
      Assert.IsTrue(0 == failedTests.Length, "The following Org Keys are not contained in the source: \n" + failedTests); 

ответ

0

Вам нужно отражение, чтобы сделать это:.?

Type type = obj.GetType(); 
PropertyInfo[] properties = type.GetProperties(); 

foreach (PropertyInfo property in properties) 
{ 
    GetColumn(orgList,property.Name); 
} 



var names = items.Select(x => x.GetType().GetProperty("prpname").GetValue(x)); 


public IEnumerable<object> GetColumn(List<Item> items, string columnName) 
{ 
    var values = items.Select(x => 
x.GetType().GetProperty(columnName).GetValue(x));//u can put your test code heere and you can loop it through object properties 
} 

вы можете создать список для хранения Rslt и добавить результаты к списку еще можно написать вывод в файлы журналов

0

Если я не понял ваш вопрос, вы могли бы сделать что-то как это с помощью shouldly

[TestMethod] 
    public void UnitTestExample() 
    { 
     var orgs = new Organisation 
     { 
      Ids = new List<int>{ 1,3 }, 
      DealerCodes = new List<string> { "foo","bar"} 
     }; 

     var members = new Organisation 
     { 
      Ids = new List<int> { 1,2,3 }, 
      DealerCodes = new List<string> { "foo", "bar", "buzz" } 
     }; 

     orgs.ShouldSatisfyAllConditions(
      () => orgs.Ids.ShouldBe(members.Ids, ignoreOrder: true), 
      () => orgs.DealerCodes.ShouldBe(members.DealerCodes, ignoreOrder: true) 
      ); 
    } 

Выход производства является:

enter image description here

Вы все равно должны указать все свойства вы хотите проверить внутри ShouldSatisfyAllConditions но shouldly делает всю тяжелую работу вокруг сравнения списков и вывести различия.

0

я считать, что:

  1. orgs является IQueryable<T1>
  2. members является IQueryable<T2>
  3. typeof(T1) == typeof(T2)

Если да, то эта функция может помочь:

private static void CompareRecords<TEntity>(IQueryable<TEntity> orgs, IQueryable<TEntity> members) 
{ 
    var entityType = typeof (TEntity); 
    var selectMethod = typeof (Queryable).GetMethods().First(x => x.Name == "Select"); 
    var exceptMethod = typeof(Queryable).GetMethods().First(x => x.Name == "Except"); 
    var toArrayMethod = typeof (Enumerable).GetMethods().First(x => x.Name == "ToArray"); 

    foreach (var property in entityType.GetProperties()) 
    { 
    var paramExpr = Expression.Parameter(entityType, "x"); 
    var propExpr = Expression.Property(paramExpr, property.Name); 
    var delegateType = typeof (Func<,>).MakeGenericType(entityType, property.PropertyType); 
    var lambdaExpr = Expression.Lambda(delegateType, propExpr, paramExpr); 

    var parameterizedSelectMethod = selectMethod.MakeGenericMethod(entityType, property.PropertyType); 
    var parameterizedExceptMethod = exceptMethod.MakeGenericMethod(property.PropertyType); 

    var source = parameterizedSelectMethod.Invoke(null, new object[] {orgs, lambdaExpr}); 
    var dest = parameterizedSelectMethod.Invoke(null, new object[] {members, lambdaExpr}); 

    var errorList = parameterizedExceptMethod.Invoke(null, new[] {source, dest}); 

    var errorListArray = toArrayMethod.MakeGenericMethod(property.PropertyType).Invoke(null, new[] {errorList}); 

    var failedTests = string.Join("\n", ((IEnumerable)errorListArray).Cast<object>().Select(x => x.ToString())); 
    Assert.IsTrue(0 == failedTests.Length, $"The following {property.Name} are not contained in the source: \n{failedTests}"); 
    } 
} 
Смежные вопросы