validationunit testing中集合/项集的完整映射

我正在使用xUnit.net,AutoFixture和SemanticComparison,并希望validation映射的结果。

在个别项目层面,我很好 。

特定

  • 这些项共享一个识别密钥
  • 我想对两边的值元素进行比较
  • 我不关心订购(并且不希望我的Assertion在重新订购时破坏)

如何使用尽可能多的OOTB组件validation每个输入项是否以DAMP但DRY方式映射到一个且仅一个输出项?

比赛时间:

class Input { public string Name, Description; } class Output { public string Name, Description, IgnoreThisField; } 

骨架测试:

 [Theory,AutoData] void MappingWorks( Mapper sut, Input[] inputs) { var outputs = sut.Map( inputs); // TODO assert that every input is mapped // TODO assert that we have have no extra outputs } 

给出一些AssertResemblance.Like Collection助手[1],你

  1. 将它们放在相同的顺序中(这在测试体中是最干净的,因为输入和输出集合将具有不同的类型,除非SemanticComparison增长了一个function,我认为它不能被有效地推广)
  2. Ploeh.SemanticComparisonName上进行匹配
  3. 让xUnit.net V2的Assert.Collection进行相关(它还没有给出一个greate消息)

最终结果是:

 var results = from result in outputs orderby result.Name select result; var expectations = from input in inputs orderby input.Name select input; AssertResemblance.Like( expectations, results, configure=>configure .Without(x=>x.IgnoreThisField) ); 

[1]

 static class AssertResemblance { public static void Like( IEnumerable expected, IEnumerable actual ) { Like( expected, actual, x=>x ); } public static void Like( IEnumerable expected, IEnumerable actual, Func, Likeness> configureLikeness ) { Assert2.Collection( actual, SelectShouldEqualAsAction( expected.Select( x => configureLikeness( x.AsSource().OfLikeness() ) ) ) ); } public static void Like( IEnumerable expected, IEnumerable actual, Func, IEnumerable> unify ) { Like( expected, actual, unify, x=>x ); } public static void Like( IEnumerable expected, IEnumerable actual, Func,IEnumerable> unify, Func, Likeness> configureLikeness ) { Assert2.Collection( unify( actual ), SelectShouldEqualAsAction( unify(expected).Select( x => configureLikeness( x.AsSource().OfLikeness() ) ) ) ); } static Action[] SelectShouldEqualAsAction( IEnumerable> that ) { return (from it in that select (Action)it.ShouldEqual).ToArray(); } } 

给定[非常简洁的] FullOuterJoin操作和xUnit.net V2,您可以将其表达为:

 static void VerifyFeaturesetFullyMapped( IEnumerable outputs, IEnumerable inputs ) { Assert.All( inputs.FullOuterJoin( outputs, f => f.Item1, r => r.Name, ( x, y, key ) => new { InDescription = x.Item2, OutDescription = y.Description } ), inout => Assert.Equal( inout.InDescription, inout.OutDescription ) ); }