C# 如何在流畅的断言中比较null和string.Empty(或“空”)呢?
我有两个相同类型的对象,该类型有一个字符串字段,第一个对象的值为null,第二个对象的值为“”,如何强制fluent AssessRestions假设这是正确的 资产本身: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,实际值为“”(或反之亦然)您可以做
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#字段吗?我是指字符串类型的属性,很抱歉误导:)