C# 如何在流畅的断言中比较null和string.Empty(或“空”)呢?

C# 如何在流畅的断言中比较null和string.Empty(或“空”)呢?,c#,integration-testing,fluent-assertions,C#,Integration Testing,Fluent Assertions,我有两个相同类型的对象,该类型有一个字符串字段,第一个对象的值为null,第二个对象的值为“”,如何强制fluent AssessRestions假设这是正确的 资产本身: callResult.ShouldBeEquivalentTo(centreResponse, opt => opt.Excluding(r => r.DateOpen)); 此处引发异常,说明预期值为null,实际值为“”(或反之亦然)您可以做

我有两个相同类型的对象,该类型有一个字符串字段,第一个对象的值为null,第二个对象的值为“”,如何强制fluent AssessRestions假设这是正确的

资产本身:

callResult.ShouldBeEquivalentTo(centreResponse, 
                                opt => opt.Excluding(r => r.DateOpen));

此处引发异常,说明预期值为null,实际值为“”(或反之亦然)

您可以做的是覆盖类型为
string
的属性的行为,如下所示:

callResult.ShouldBeEquivalentTo(centreResponse, opt => opt
          .Excluding(r => r.DateOpen)
          .Using<string>(ctx => CompareStrings(ctx)).WhenTypeIs<string>());       

public void CompareStrings(IAssertionContext<string> ctx)
{
    var equal = (ctx.Subject ?? string.Empty).Equals(ctx.Expectation ?? string.Empty);

    Execute.Assertion
        .BecauseOf(ctx.Because, ctx.BecauseArgs)
        .ForCondition(equal)
        .FailWith("Expected {context:string} to be {0}{reason}, but found {1}", ctx.Subject, ctx.Expectation);
}    
callResult.ShouldBeEquivalentTo(中心响应,opt=>opt
.不包括(r=>r.DateOpen)
.使用(ctx=>CompareStrings(ctx)).WhenTypeIs();
公共无效比较字符串(IAssertionContext ctx)
{
var equal=(ctx.Subject??string.Empty).等于(ctx.Expectation??string.Empty);
执行.断言
.因为(因为,因为)
.ForCondition(相等)
.FailWith(“预期{context:string}为{0}{reason},但发现{1}”,ctx.Subject,ctx.Expectation);
}    
通过将
CompareStrings
方法封装在
iasertionrule
的实现中,可以稍微清理一下这个问题。请参阅FluentAssertions的单元测试中的
RelagingDateTimeAssertionRule


您可以将自定义断言规则添加为
callResult
变量类型上所有断言的默认值,但我仍然需要添加一些允许全局默认值的内容。

对象是什么类型?我可以假设中心响应是一个字符串,opt是string[]或什么吗?为什么要将
null
和空字符串视为等价物?这很少是一个好主意。对象的类型是CentreResponse,这是一个复杂的类型,关于比较规则-这是要求,它们来自不同的数据源,但在这个特定的上下文中null和空字符串与字段相等,你是指C#字段吗?我是指字符串类型的属性,很抱歉误导:)