参数约束的随机问题

时间:2016-05-03 07:11:16

标签: c# unit-testing fakeiteasy

在我的单元测试中使用FakeItEasy时,我遇到了一个超级奇怪的问题......

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

Dim pattern As String = "^(?:[^\s]+\s){7}([^\s]+)"
Dim input As String = "Invoice CO1234 1234567890 06.01.2016 06.01.2016 USD 6.72 1 1"
Dim match As Match = Regex.Match(input, pattern)
console.WriteLine(match.Groups(1).Value)

问题是这个断言失败有时。我注意到,当我在一次运行中运行所有测试(“全部运行”)时通常会失败,但如果我只运行此特定A.CallTo(() => fakeStorageClient.StoreAsync("commands", A<CommandEnvelope<FakeCommand>>.Ignored, false)).MustHaveHappened(Repeated.Exactly.Once); 则不会。正如您所注意到的,该方法为Fact,因此我在考虑一些与异步相关的问题,但所有调用都已正确async

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

await

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

我希望有人可以帮我弄清楚为什么FakeItEasy会将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) 约束评估为NULL,而且,为什么它只会有时 ...

1 个答案:

答案 0 :(得分:1)

问题证明是issue 476的一种表现形式,已在最新的FakeItEasy 2.0.0版本候选版本中得到修复。升级到该版本修复了它,因为我希望单线程运行测试可以。