我偶然发现了这个开源项目Fake It Easy,我不得不承认,它看起来很有趣,但是我有疑问,FIE fakes 和 Moq Mocks 有什么区别?有没有更适合特定用途的?
编辑:
这个新框架是什么让它比 Moq 更好?
我偶然发现了这个开源项目Fake It Easy,我不得不承认,它看起来很有趣,但是我有疑问,FIE fakes 和 Moq Mocks 有什么区别?有没有更适合特定用途的?
编辑:
这个新框架是什么让它比 Moq 更好?
明确地说,我创建了 FakeItEasy,所以我绝对不会说一个框架是否比另一个更好,我能做的就是指出一些差异并激发我创建 FakeItEasy的原因。在功能上,起订量和 FakeItEasy 之间没有重大区别。
FakeItEasy 没有“可验证”或“期望”,但它有断言,这些断言总是在测试结束时明确说明,我相信这使测试更容易阅读和理解。它还可以帮助初学者避免多个断言(他们会在许多调用或模拟对象上设置期望)。
我之前使用过 Rhino Mocks,我非常喜欢它,尤其是在引入 AAA 语法之后,我确实更喜欢 Moq 的 fluent API。我不喜欢 Moq 的“模拟对象”,你必须在任何地方使用 mock.Object,我更喜欢带有“自然”模拟的 Rhino 方法。每个实例看起来和感觉都像是伪造类型的正常实例。我想要两全其美,也想看看当我完全空闲时可以用语法做什么。就个人而言,我(显然)认为我创造的东西可以很好地融合两个世界中最好的东西,但是当你站在巨人的肩膀上时,这很容易。
正如这里所提到的,主要区别之一是术语,FakeItEasy 最初是为了向初学者介绍 TDD 和模拟,并且不得不担心模拟和存根之间的差异(就像你在 Rhino 中必须做的那样)是在我看来不是很有用。
我已经非常关注异常消息,只要查看异常消息就可以很容易地判断测试中什么时候出错了。
FakeItEasy 具有其他框架所没有的一些可扩展性功能,但这些功能还没有得到很好的记录。
FakeItEasy(希望)在模拟具有构造函数参数的类方面更强一些,因为它具有解析要使用的虚拟值的机制。你甚至可以通过在你的测试项目中实现一个 DummyDefinition(Of T) 类来指定你自己的虚拟值定义,这将被 FakeItEasy 自动拾取。
语法是一个明显的区别,哪个更好在很大程度上取决于口味。
我确信我现在忘记了许多其他差异(公平地说,我自己从未在生产中使用过起订量,所以我对它的了解有限),但我确实认为这些是最重要的差异。
测试中使用的术语可能会有些混乱。解释不同概念之间差异的最佳来源是Martin Fowler 的Mocks Aren't Stubs。总而言之,fake是一个通用术语,它同时描述了 stub 和 mock。
模拟中的术语可能会令人困惑 - 有时非常不直观。
因此,许多人提出了一个更简单的新术语,其中只有fakes、mocks和stubs。
Fake是所有可能类型的测试替身的总称,无论它们来自何处以及如何使用。
除此之外,假货仅在一个维度上进行区分:它们是否影响测试结果;或者,换句话说:您是否必须为假货设置返回值,这些值在测试执行期间以某种方式使用,或者它是一个“静默”对象,仅用于满足某些依赖性。
存根就是那个'沉默'的对象。
模拟它积极参与测试执行
除此之外,没有进一步的区别 - 这肯定有其历史优点,但现在在很大程度上是违反直觉和学术的,它有点混淆了测试驱动开发的真正重要概念。
关于Moq和FakeItEasy之间的比较:从概念的角度来看,这两个框架在很大程度上是相同的——不同之处仅在于 API 和术语......
托马斯
从我的角度来看,Fake 不会取消 Moc,例如我使用 Dev Magic Fake 来伪造 DAL 和业务层,同时我在 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
测试这个方法,我们必须模拟 HTTP 上下文
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
所以我使用假和模拟