摘要:在使用 Fluent Assertions 编写单元测试时,我遇到了一些我在下面详细描述的问题。如果您需要我提供任何其他信息,请告诉我,但我不确定这是否确实是预期的行为,或者我误解了某些东西。
问题 1 是对象引用未设置为我正在观察的实例异常。与定义 ExcludeMissingProperties 的方式相比,问题 2 的行为似乎出乎意料。
对于下面的问题,我使用以下示例类来帮助演示我正在谈论的问题。
public class B
{
public string Name { get; set; }
public int Id { get; set; }
}
internal class BTo
{
internal int Id { get; set; }
}
public class C
{
public int ID { get; set; }
public B B { get; set; }
}
问题 1:当期望没有设置复杂类型属性时,对象引用未设置为实例异常。
一个。如果预期对象 (expectation) 未设置复杂类型属性,而实际 (subject) 设置了,则未将对象引用设置为实例会引发错误。这对于简单的对象可能没问题,但在 DTO 严重嵌套的实际测试场景中,很难找到导致异常的原因。
湾。与此异常相关,如果我们可以抛出导致异常的属性的名称,那将非常有用。我知道这是一个未经处理的场景。
样品测试:
var expected = new C
{
ID = 1,
};
var actual = new C
{
ID = 1,
B = new B
{
Id = 1,
Name = "name"
}
};
actual.ShouldBeEquivalentTo(expected, expr => expr.ExcludingMissingProperties());
问题 2:ExcludingMissingProperties 的定义 我不得不编写大量代码来解决默认行为。
对于我的很多测试用例,我不想设置期望属性;例如:我想检查是否生成了主键的数据库插入场景(因此该值不应该是默认值就足够了),但我不在乎该值是什么。同样,还有其他与我的测试用例无关的嘈杂属性。
所以这失败了:
var expected = new B { Name = "somevalue"};
var actual = new B { Id = 1, Name = "somevalue" };
actual.ShouldBeEquivalentTo(expected, x => x.ExcludingMissingProperties());
这通过:
var expected = new BTo { Id = 1};
var actual = new B { Id = 1, Name = "somevalue" };
actual.ShouldBeEquivalentTo(expected, e => e.ExcludingMissingProperties());