如何在 FakeItEasy 2 中循环有序断言

Howto loop OrderedAssertions in FakeItEasy 2

据我了解,FakeItEasy 2 中的有序断言是这样完成的(来自文档):

// Assert
A.CallTo(() => unitOfWorkFactory.BeginWork()).MustHaveHappened()
    .Then(A.CallTo(() => usefulCollaborator.JustDoIt()).MustHaveHappened())
    .Then(A.CallTo(() => unitOfWork.Dispose()).MustHaveHappened());

现在,假设我有一个集合,对于这个集合中的每个项目,我想断言调用了一个伪造的对象。断言调用顺序正确的最佳方法是什么?

我想到了这个,但不太喜欢它:

    IOrderableCallAssertion ioca = null;
    foreach (var item in items.OrderBy(i => i.Id)
    {
        var itemUnderTest = item;
        if (ioca == null)
        {
            ioca = A.CallTo(() => fakeObject.Handle(itemUnderTest, otherArgument)).MustHaveHappened(Repeated.Exactly.Once);
        }
        else
        {
            ioca = ioca.Then(A.CallTo(() => fakeObject.Handle(itemUnderTest, otherArgument)).MustHaveHappened(Repeated.Exactly.Once));
        }
    }

我觉得差不多。当然,您可以内联 itemUnderTest 并将 MustHaveHappened 拉到两个 if 分支之外。

而且您始终可以将其隐藏在一个方便的方法中。

另一种方法:使用 Invokes 在呼叫进入时捕获虚假信息,然后将它们与列表进行比较。