参数约束的随机问题

Random issue with argument constraints

我在单元测试中使用 FakeItEasy 时遇到 super 奇怪的问题...

我断言是否已对模拟进行了调用,并且我对方法的参数之一指定了约束,例如:

A.CallTo(() => fakeStorageClient.StoreAsync("commands", A<CommandEnvelope<FakeCommand>>.Ignored, false)).MustHaveHappened(Repeated.Exactly.Once);

问题是这个断言 有时 会失败。我注意到通常当我 运行 我的所有测试都在一个 运行 ("Run All") 时它会失败,但如果我只 运行 这个特定的 Fact一个人。正如您所注意到的,该方法是 async 所以我在考虑一些与异步相关的问题,但所有调用都是正确的 awaited.

查看断言失败的详细信息,日志为:

Assertion failed for the following call:
Backend.Data.MessageStorage.IMessageStorageClient.StoreAsync("commands", <NULL>, False)
Expected to find it exactly once but found it #0 times among the calls:
1: Backend.Data.MessageStorage.IMessageStorageClient.StoreAsync(
      tableName: "commandStream",
      entity: Backend.Domain.Commands.CommandEnvelope`1[Backend.Domain.Tests.FakeCommand],
      streamMode: True)
2: Backend.Data.MessageStorage.IMessageStorageClient.StoreAsync(
      tableName: "commands",
      entity: Backend.Domain.Commands.CommandEnvelope`1[Backend.Domain.Tests.FakeCommand],
      streamMode: False)

如您所见,预期的调用确实发生了(情况 #2),但出于某种原因,FakeItEasy 期待使用 NULL 作为第二个参数的调用!

我希望有人能帮我弄清楚为什么 FakeItEasy 会将 A<CommandEnvelope<FakeCommand>>.Ignored 约束评估为 NULL 而且,为什么它只会 有时 ...

问题原来是issue 476的表现,已在最新的FakeItEasy 2.0.0候选发布版中修复。升级到那个版本修复了它,正如我所料 运行 测试单线程会。