【问题标题】:How to use FakeItEasy to assert a method was not called如何使用 FakeItEasy 断言方法未被调用
【发布时间】:2013-07-29 21:43:40
【问题描述】:

我想断言没有发送任何东西,也就是没有调用_dispatcher.Dispatch

interface 被伪造/嘲笑:

interface IDispatcher
{
    void Dispatch<T>(T command, 
                     Stuff stuff = null,
                     TimeSpan? timeout = null,
                     int? retries = null) where T : Command;
}

在测试体中:

_dispatcher = A.Fake<IDispatcher>();

// do stuff

A.CallTo(() => _dispatcher.Dispatch(A<Command>.Ignored,
                                    A<Stuff>.Ignored,
                                    A<TimeSpan?>.Ignored,
                                    A<int?>.Ignored)).MustNotHaveHappened();

发送了一些东西时,这个测试通过

有什么想法吗?我是否错误地使用了 FakeItEasy?

【问题讨论】:

  • 您很可能设置了错误的 CallTo()。例如:您确定要将 A._ 而不是 A._ 作为第二个参数吗?
  • 你试过反过来吗? .MustHaveHappened() 是否在发送某些东西时工作?我猜不会。
  • 你确定你真的在打电话给Dispatch&lt;T&gt;吗?另外,DispatchWorkDispatch&lt;T&gt; 是两种不同的方法。
  • @D.R.更新了问题。那是一个错字。
  • @PoweredByOrange 更新了问题——错字。

标签: c# .net unit-testing xunit fakeiteasy


【解决方案1】:

@史酷比

您调用 dispatch 方法时使用的实际类型真的是 Command 吗?或者它是派生类型?如果它是可能导致您观察到的行为的派生类型。

请参见以下示例: var dispatcher = A.Fake();

dispatcher.Dispatch(new Command(), new Stuff());

A.CallTo(() => dispatcher.Dispatch(A<Command>.Ignored,
                                    A<Stuff>.Ignored,
                                    A<TimeSpan?>.Ignored,
                                    A<int?>.Ignored)).MustNotHaveHappened();

正如预期的那样,此测试将失败。

但如果你有这样的事情:

public class NewCommand : Command
{
}

下面的测试

var dispatcher = A.Fake<IDispatcher>();

dispatcher.Dispatch(new NewCommand(), new Stuff());

A.CallTo(() => dispatcher.Dispatch(A<Command>.Ignored,
                                    A<Stuff>.Ignored,
                                    A<TimeSpan?>.Ignored,
                                    A<int?>.Ignored)).MustNotHaveHappened();

会成功,虽然你预计会失败。

但这就是 FakeItEasy 的工作原理。如果您想讨论它是否应该以这种方式工作,请转到 https://github.com/FakeItEasy/FakeItEasy 并打开一个问题。

现在解决您的问题。我假设您要确保永远不会调用 IDispatcher.Dispatch 方法,无论泛型参数具有哪种类型。 您有两种选择:

由于Dispatch 方法是IDispatcher 上唯一的方法,我只想写以下内容

A.CallTo(dispatcher).MustNotHaveHappened();

dispatcher 实例上的任何方法(或属性)被调用时,这将失败。

A.CallTo(dispatcher).Where(_ => _.Method.Name == "Dispatch")
    .MustNotHaveHappened();

这只会在调用Dispatch 时失败,尽管这种用法是重构杀手。

如果可能的话,我更喜欢第一种选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多