在 Fluent Assertions 中使用 BeEquivalentTo 的意外行为

Unexpected behaviour using BeEquivalentTo in Fluent Assertions

我对流利的断言有疑问,这似乎与文档的陈述相悖。 我有这个简单的案例来说明问题。

public class UnitTest1
{
    [Fact]
    public void Test1()
    {
        var test = new Test { Name = "Test", Value = "123" };
        var testDto = new TestDto { Name = "Test" };

        test.Should().BeEquivalentTo(testDto);
    }
}

public class Test
{
    public string Name { get; set; }
    public string Value { get; set; }
}

public class TestDto
{
    public string Name { get; set; }
} 

我预计此测试会失败,因为“值”属性 在 TestDto class.

上不存在

文档说明根据这句话我的理解应该是正确的。

All public members of the Order object must be available on the OrderDto having the same name. If any members are missing, an exception will be thrown.

我是不是理解错了,或者这是 Fluent Assertions 中的一个问题?

这是预期的行为。 Fluent Assertion 通过在 Test.

上匹配 TestDto 的公开属性来评估对象图

尝试颠倒顺序,断言按预期失败。

public class UnitTest1
{
    [Fact]
    public void DoesNotFail()
    {
        var test = new Test { Name = "Test", Value = "123" };
        var testDto = new TestDto { Name = "Test" };

        test.Should().BeEquivalentTo(testDto);
    }

    [Fact]
    public void WillFail()
    {
        var test = new Test { Name = "Test", Value = "123" };
        var testDto = new TestDto { Name = "Test" };

        testDto.Should().BeEquivalentTo(test);
    }
}

Fluent Assertion 的规范说明预期对象的所有 public 成员必须在测试对象上可用,否则将抛出异常:

testObject.Should().BeEquivalentTo(expectedObject);

如果你替换

  • expectedObject -> 测试
  • testObject -> testDto

testDto.Should().BeEquivalentTo(test);

然后它会如你所料的那样工作,它会抛出异常。

但是如果你像你那样替换这两个对象,它不会抛出异常,因为在那种情况下,预期的所有道具 (testDto) 都存在于testObject (测试).