我正在使用Fluent Assertion库作为我的单元测试中的一部分自定义序列化代码的一部分,我正在寻找一种方法来强制将ShouldBeEquivalentTo比较为null和空列表。
基本上,我的测试看起来像:
[Test]
public void Should_be_xxx()
{
ClassWithList one = new ClassWithList { Id = "ten", Items = null };
string serialized = Serialize(one);
ClassWithList two = Deserialize(serialized);
two.ShouldBeEquivalentTo(one);
}
但是,Deserialize方法的一个特性是,如果输入数据中缺少集合类型,它会将反序列化类的属性设置为空列表,而不是null。所以,非常简化,我最终得到的情况是实例2,Items = new List<string>
而不是null。
显然,我可以在比较之前设置one.Items = new List<string>()
,但实际上我有很多复杂的域对象,我在这些方法中断言,我正在寻找一个通用的解决方案。换句话说,有没有人知道如何进行以下测试:
public class ClassWithList
{
public string Id { get; set; }
public List<string> Items { get; set; }
}
[Test]
public void Should_be_xxx()
{
ClassWithList one = new ClassWithList { Id = "ten", Items = null };
ClassWithList two = new ClassWithList { Id = "ten", Items = new List<string>() };
two.ShouldBeEquivalentTo(one);
}
换句话说,我希望将以下测试应用于类X中的所有集合,作为比较等价的一部分:
if (subject.Items == null)
{
expected.Items.Should().BeEmpty();
}
else
{
expected.Items.Should().BeEquivalentTo(subject.Items);
}
答案 0 :(得分:3)
您必须实施自定义&nbsp; IEquivalencyStep&#39;或者使用(自定义操作)。当类型(谓词)。
答案 1 :(得分:3)
根据上面Dennis的信息,我能够解决以下实际代码:
public class ClassWithList
{
public string Id { get; set; }
public List<string> Items { get; set; }
public List<ClassWithList> Nested { get; set; }
}
[TestClass]
public class Test
{
[TestMethod]
public void Should_compare_null_to_empty()
{
ClassWithList one = new ClassWithList { Id = "ten", Items = null, Nested = new List<ClassWithList> { new ClassWithList { Id = "a" } } };
ClassWithList two = new ClassWithList { Id = "ten", Items = new List<string>(), Nested = new List<ClassWithList> { new ClassWithList { Id = "a", Items = new List<string>(), Nested = new List<ClassWithList> { } } } };
two.ShouldBeEquivalentTo(one, opt => opt
.Using<IEnumerable>(CheckList)
.When(info => typeof(IEnumerable).IsAssignableFrom(info.CompileTimeType)));
}
private void CheckList(IAssertionContext<IEnumerable> a)
{
if (a.Expectation == null)
{
a.Subject.Should().BeEmpty();
}
else
{
a.Subject.ShouldBeEquivalentTo(a.Expectation, opt => opt
.Using<IEnumerable>(CheckList)
.When(info => typeof(IEnumerable).IsAssignableFrom(info.CompileTimeType)));
}
}
}
答案 2 :(得分:0)
创建一个IAssertionRule
:
public class EnumerableNullEmptyEquivalenceRule : IAssertionRule
{
public bool AssertEquality(IEquivalencyValidationContext context)
{
// not applicable - return false
if (!typeof(IEnumerable).IsAssignableFrom(context.SelectedMemberInfo.MemberType)) return false;
return context.Expectation == null && ((IEnumerable)context.Subject).IsNullOrEmpty();
}
}
然后适用于您的BeEquivalentTo
通话:
actual.Should().BeEquivalentTo(expected, opt => opt.Using(new EnumerableNullEmptyEquivalenceRule()));