假货比Mocks好吗?
我偶然发现了这个开源项目Fake It Easy ,我不得不承认,这看起来非常有趣,但是我怀疑,FIE假货和Moq Mocks之间有什么区别? 有什么更好的特殊用途?
编辑:
这个新的框架是什么使它比Moq更好呢?
要清楚的是,我创build了FakeItEasy,所以我绝对不会说一个框架是否比另一个框架好,我可以做的是指出一些差异,并激发为什么我创造了FakeItEasy。 Moq和FakeItEasy之间在function上没有大的区别。
FakeItEasy没有“可validation”或“期望”,但是它们总是在testing结束时明确说明,我相信这使得testing更容易阅读和理解。 它还可以帮助初学者避免多次断言(他们会在许多调用或模拟对象上设置期望值)。
之前我使用过Rhino Mocks,我非常喜欢它,特别是在引入AAA语法之后,我更喜欢Moq的stream畅API。 我不喜欢Moq的是“模拟对象”,你必须在所有地方使用模拟对象。我更喜欢“自然”模拟的犀牛模式。 每个实例的外观和感觉都像是伪造types的正常实例。 我想要两全其美,而且当我完全放手的时候,我想看看我能用语法做些什么。 我个人(显然)认为我创造了一个与世界上最好的混合的东西,但是当你站在巨人的肩膀上时,这很容易。
正如这里所提到的,主要区别之一是术语上的差异,FakeItEasy最初是为了引入TDD和嘲弄初学者,不必担心模拟和存根之间的区别(你将不得不在犀牛中)在我看来不是很有用。
我已经把很多的注意力放到了exception消息中,只要看一个exception消息就可以非常容易地知道在testing中什么时候出错了。
FakeItEasy具有其他框架没有的扩展性特征,但是这些特征还没有很好的logging。
FakeItEasy(有希望)在模拟具有构造函数参数的类中稍微强一点,因为它具有parsing要使用的虚拟值的机制。 你甚至可以通过在你的testing项目中实现一个DummyDefinition(Of T)类来指定你自己的虚拟值定义,这个将会被FakeItEasy自动获得。
语法是一个明显的区别,哪一个更好在很大程度上是一个品味问题。
我敢肯定,现在我忘记了很多其他的差异(为了公平,我从来没有用过Moq,所以我的知识是有限的),但我认为这些是最重要的差异。
testing中使用的术语可能会有些混淆。 解释不同概念之间区别的最佳来源是Martin Fowler的Mocks Are Stubs 。 总之, 假是一个通用的术语,它描述了存根和嘲讽。
嘲笑的术语可能会令人困惑,有时甚至是不直观的。
因此,许多人提出了一个更简单,新的术语,你只有假货 , 嘲笑和存根 。
假是所有可能的testing双打的通用术语,无论它们来自哪里以及如何使用。
除此之外, 假货只有一个方面的区别:它们是否影响testing结果; 或者换句话说:你是否必须为假的设置返回值,这在testing执行过程中以某种方式使用,或者它是一个“ 沉默 ”的对象,它只是用来实现一些依赖。
存根就是那个“ 沉默 ”的对象。
模拟它正在积极参与testing执行
除此之外,没有进一步的区别 – 这确实有其历史价值,但现在大部分是反直觉和学术,这是混淆真正重要的testing驱动开发的概念。
关于Moq和FakeItEasy之间的比较:从概念的angular度来看,两个框架大体上是相同的 – 只是在API和术语上有所不同 。
托马斯
从我的angular度来看,Fake不会取消Moc,例如我使用Dev Magic Fake来伪造DAL和Business层,同时我在MVC中使用Mock来获取HTTPContext
var repoistory = new FakeRepository<ProductTypeForm, VendorForm>(); repoistory.Save(productTypeForm); this.FillDropDown(new FakeRepository<VendorForm>());
在前面的代码中,Dev Magic Fake将保存ProductTypeForm并从Dev Magic Fake中检索VendorForm,并将其链接到ProductTypeForm,此保存操作可以是永久的
有关Dev Magic Fake的更多信息,请参阅CodePlex: http : //devmagicfake.codeplex.com
我们testing这个方法我们必须模拟HTTP上下文
var context = new Mock<HttpContextBase>(); var request = new Mock<HttpRequestBase>();
所以我用假和模拟工作