用动作假动作很简单 - 说它无法找到呼叫,但在列表中显示

时间:2017-07-03 11:28:49

标签: c# unit-testing action fakeiteasy

我很容易使用假装:

var callBackAction = A.Fake<Action<object>>();

//act
token.RegisterChangeCallback(callBackAction, "hi");

//assert
A.CallTo(() => callBackAction.Invoke(A<object>.Ignored)).MustHaveHappened();

我收到了错误

    FakeItEasy.ExpectationException : Assertion failed for the following call: 

    System.Action`1[System.Object].Invoke(obj: <Ignored>) Expected to find it 

    exactly once but found it #0 times among the calls: 

          1:     System.Action`1[System.Object].Invoke(obj: "hi)

这对我来说似乎很奇怪。我可以理解它是否找不到或者它是否与覆盖equals()有关但这很奇怪,因为它显然已经找到了我的调用并且我使用了一个被忽略但它不匹配它们。 这与使用动作有关吗?

1 个答案:

答案 0 :(得分:4)

这是因为生成了一个等待条件的线程,然后在该线程中调用该操作。在测试中,这种情况立即成立,因此线程返回得非常快。这对于资产来说不够快,因为在创建线程之后会立即发生这种情况,因此测试失败。但是,在断言失败之后,在FakeItEasy完成收集错误消息的调用之前,将调用该操作。这导致FakeItEasy显示它被作为其错误消息的一部分被调用,尽管测试由于没有被调用而失败。

这就是我认为的情况。 Diagram of threads