在FakeItEasy中,Dummy用于什么?

16

Dummy 在 FakeItEasy 中用于什么?它与 A.Fake 或 A.Ignored 有什么不同?

谢谢 :-)

2个回答

14

虚假对象(dummy)在FakeItEasy本身并没有实际用途,它只是一种创建虚假实例的方式,您可以在测试中使用它们。

例如,假设您想要测试以下类:

public class Foo
{
    public void Bar(DateTime someDate);
}

现在,在你的测试中,你想调用bar方法,但是传递给它的值对于测试不重要。你可以这样写:

foo.Bar(new DateTime(2000, 1, 1));
你可以写成:

你可以这样写:

foo.Bar(A.Dummy<DateTime>());
这表示该值对测试来说真的不重要,所以使用它的整个原因是为了更好地传达意图。

2
这对我来说仍然听起来像是被忽略的。使用上有什么区别吗? - cecilphillip
刚刚我自己尝试了一下;在A.CallTo().MustHaveHappened()中使用A.Dummy<>不会像A<>.Ignore一样被接受任何值。除此之外,我也不知道了。 - Stefan Billiet
我真的看不出有什么不清楚的。你知道上面的类Foo是被测试的类,而不是一个假的类吧?A.Dummy只创建一个虚拟值,仅此而已。它不能在配置调用时使用。 - Patrik Hägne

5
@Patrik Hägne的回答描述了用户如何使用Dummy,但是还有另一部分内容。FakeItEasy确实使用了Dummy。
当FakeItEasy需要通过调用类的构造函数创建一个Fake类实例(或者有时是另一个Dummy类实例),并且构造函数需要参数时,它会为参数使用Dummies。
我鼓励您查看Dummy文档。 (链接)

那么 DummyA<>.Ignored 的低级版本吗?后者使用起来更有意义。 - silkfire
不是这样的。A<T>.Ignored 是由用户提供的,用于断言调用是否发生。它将匹配调用中提供的任何参数(当您只关心其他一些参数时非常有用)。您只能在断言内部使用 A<>.Ignore。我永远不会在断言内部使用 Dummy,因为它会导致 FakeItEasy 对该值执行相等性检查,如果将来检查的参数发生更改,则测试将失败。 - Blair Conrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接