FakeItEasy 参数约束在 lambda 之外被评估为 null

FakeItEasy argument constraint being evaluated as null outside of lambda

使用 FakeItEasy,我在我的一项测试中有一个类似于下面的设置,当这样设置时,底部的 CallTo 断言失败。

var fakedTool = A.Fake<ITool>();

var concreteUnderTest = new Concrete(fakedTool);

concreteUnderTest.doSomething();

var fooConstraint = A<Foo>.That.Matches(f => f.Name.Equals('Alice'));
var barConstraint = A<Bar>.Ignored;

A.CallTo(() => fakedTool.ObservedFunction(fooConstraint , barConstraint))
    .MustHaveHappened(Repeated.Exactly.Once);

我直接在CallTo行上面下了断点,fooConstraintbarConstraint的值都是null.

然而,当我这样设置断言时,它通过了:

A.CallTo(() =>
    fakedTool.ObservedFunction(
        A<Foo>.That.Matches(f => f.Name.Equals('Alice')),
        A<Bar>.Ignored
    )
).MustHaveHappened(Repeated.Exactly.Once);

是什么导致了这种行为?是故意的吗?

这是有意为之的行为。您可以在文档中查看 Always place Ignored and That inside A.CallTo 部分。

从 FakeItEasy 2.0.0 开始,FakeItEasy will throw an exception when they're stored as variables and invoked,而不是因为为空而悄悄失败。