C# 相似性-抛光和包装
我使用C# 相似性-抛光和包装,c#,unit-testing,xunit,autofixture,semantic-comparison,C#,Unit Testing,Xunit,Autofixture,Semantic Comparison,我使用Ploeh.SemanticComparison的相似性作为一种有效表达映射过程预期输出的方法(如中所述) 我正在测试一些数据是否正确映射,如下所示: [Theory, AutoData] static void ShouldYieldIdentifierUpdatedEvent( Vendor sut, string name, string version, Guid id ) { var result = sut.SyncProduct( name, version, id
Ploeh.SemanticComparison
的相似性
作为一种有效表达映射过程预期输出的方法(如中所述)
我正在测试一些数据是否正确映射,如下所示:
[Theory, AutoData]
static void ShouldYieldIdentifierUpdatedEvent( Vendor sut, string name, string version, Guid id )
{
var result = sut.SyncProduct( name, version, id );
var expected = new { ProductId = id, Name = name, Version = version };
expected.AsSource().OfLikeness<NewMappingsEvent>()
.Without( y => y.ProgrammaticIdentifier)
.ShouldEqual(result);
}
[理论,自动数据]
静态void ShouldYieldIdentifierUpdatedEvent(供应商sut、字符串名称、字符串版本、Guid id)
{
var result=sut.SyncProduct(名称、版本、id);
var应为新的{ProductId=id,Name=Name,Version=Version};
应为likenness()的.AsSource()
.Without(y=>y.ProgrammaticIdentifier)
.ShouldEqual(结果);
}
然而,我并不高兴:-
,而不使用(y=>y.ProgrammaticIdentifier)
customization)Assert.Equal(预期、实际、比较器)
的对称性(但我确实需要ShouldEqual
的错误消息)是否有一种更简洁的方式在所表达的约束中表达这一点?如果您有一个名为
assertsimilance
(如[4])的断言助手类,以及一个范围内类似[1]的static
助手,您可以这样说:
var expected = new { ProductId = id, Name = name, Version = version };
AssertResemblance.Like( expected, result, WithoutProgrammaticIdentifier );
或者,如果您有一个像[2]这样的扩展方法,您可以这样做:
AssertResemblance.Like( expected,result,x=>x.WithoutProgrammaticIdentifier());
或者,您可以两全其美(与第一个代码段中一样没有噪音),但通过在扩展方法([2])中实现局部静态辅助对象(如[3])来命名相似性(通过在扩展方法中使用实际的impl)
[1]
无程序标识符的公共静态相似性(相似性)
{
返回.Without(x=>x.ProgrammaticIdentifier);
}
[2]
静态类newmappingseventerembrance
{
不带程序标识符的公共静态相似性(该相似性)
{
返回.Without(x=>x.ProgrammaticIdentifier);
}
}
[3]
无程序标识符的静态相似性(相似性)
{
返回该.WithoutProgrammaticIdentifier();
}
[4]
静态类资产相似性
{
公共静态空隙(预期为T,实际为T2)
{
Like(预期的,实际的,x=>x);
}
公共静态void-Like(预期为T,实际为T2,函数配置相似)
{
var likess=期望的.AsSource().OfLikeness();
配置相似性(相似性)。应相等(实际);
}
}
如果您有一个名为assertsimilance
(如[4])的断言助手类,以及一个类似[1]的static
助手类,您可以这样说:
var expected = new { ProductId = id, Name = name, Version = version };
AssertResemblance.Like( expected, result, WithoutProgrammaticIdentifier );
或者,如果您有一个像[2]这样的扩展方法,您可以这样做:
AssertResemblance.Like( expected,result,x=>x.WithoutProgrammaticIdentifier());
或者,您可以两全其美(与第一个代码段中一样没有噪音),但通过在扩展方法([2])中实现局部静态辅助对象(如[3])来命名相似性(通过在扩展方法中使用实际的impl)
[1]
无程序标识符的公共静态相似性(相似性)
{
返回.Without(x=>x.ProgrammaticIdentifier);
}
[2]
静态类newmappingseventerembrance
{
不带程序标识符的公共静态相似性(该相似性)
{
返回.Without(x=>x.ProgrammaticIdentifier);
}
}
[3]
无程序标识符的静态相似性(相似性)
{
返回该.WithoutProgrammaticIdentifier();
}
[4]
静态类资产相似性
{
公共静态空隙(预期为T,实际为T2)
{
Like(预期的,实际的,x=>x);
}
公共静态void-Like(预期为T,实际为T2,函数配置相似)
{
var likess=期望的.AsSource().OfLikeness();
配置相似性(相似性)。应相等(实际);
}
}
Hi Ruben,使用当前的API,这是唯一的方法。在不久的将来,虽然可以使用自动映射库(例如AutoMapper),这样您就可以使用您选择的自动映射库来创建自定义项、配置文件、配置等。@NikosBaxevanis我一直在扫描该线程,很明显这里正在进行一些有益的事情,但请原谅我的双关语,对于我来说,这在很大程度上是希腊语:P我喜欢Ploeh.SemanticComparison
中的语法(也就是说,我还没有遇到一个我还不能扭曲以适应我的金锤的案例:D)Hi Ruben,使用当前的API,这是唯一的方法。在不久的将来,虽然可以使用自动映射库(例如AutoMapper),这样您就可以使用您选择的自动映射库来创建自定义项、配置文件、配置等。@NikosBaxevanis我一直在扫描该线程,很明显这里正在进行一些有益的事情,但请原谅我的双关语,对于我来说,这在很大程度上是希腊语:P,我喜欢Ploeh.SemanticComparison
中的语法(也就是说,我还没有遇到一个案例,我还不能扭曲以适应我的金锤:D)
static Likeness<T, NewMappingsEvent> WithoutProgrammaticIdentifier<T>( Likeness<T, NewMappingsEvent> that )
{
return that.WithoutProgrammaticIdentifier();
}
static class AssertResemblance
{
public static void Like<T, T2>( T expected, T2 actual )
{
Like( expected, actual, x => x );
}
public static void Like<T, T2>( T expected, T2 actual, Func<Likeness<T, T2>, Likeness<T, T2>> configureLikeness )
{
var likeness = expected.AsSource().OfLikeness<T2>();
configureLikeness( likeness ).ShouldEqual( actual );
}
}