2

我想断言没有发送任何内容,也_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?

4

1 回答 1

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,尽管这种用法是重构杀手。

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

于 2013-08-22T04:52:27.193 回答