2013-07-29 32 views
2

我想断言没有被派往,又名_dispatcher.Dispatch不叫如何使用FakeItEasy断言的方法不叫

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?

+1

你最可能设置了错误的CallTo()。例如:你确定你想要A ._而不是A ._作为第二个参数吗? –

+1

你有没有尝试过呢? .MustHaveHappened()是否在派发事物时工作?我猜不是。 –

+1

你确定你正在拨打'Dispatch '吗?此外,'DispatchWork'和'Dispatch '是两种不同的方法。 – PoweredByOrange

回答

1

@Scoobie

是实际的类型,与您通话的调度方法,真的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实例的任何方法(或财产)为这失败调用。何时Dispatch进行呼叫时,虽然这种用法是一个重构的杀手

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

这只会失败。

如果可能的话,我宁愿选择第一个选择。