C# 赝品比仿制品好吗?

C# 赝品比仿制品好吗?,c#,unit-testing,mocking,fakeiteasy,C#,Unit Testing,Mocking,Fakeiteasy,我偶然发现了这个开源项目,我不得不承认,它看起来很有趣,但是我有我的疑问,FIE赝品和say Moq模拟之间有什么区别?有哪一款适合特定用途 编辑: 这个新框架有什么比说Moq更好的地方 测试中使用的术语可能会有点混淆。解释不同概念之间差异的最佳来源是Martin Fowler。总之,fake是一个描述存根和mock的通用术语。mock中的术语可能会让人困惑,有时甚至很不直观 因此,许多人提出了一个更简单的新术语,即只有赝品、仿制品和存根 Fake是所有可能的测试双打的通用术语,无论它们来自何处

我偶然发现了这个开源项目,我不得不承认,它看起来很有趣,但是我有我的疑问,FIE赝品和say Moq模拟之间有什么区别?有哪一款适合特定用途

编辑:


这个新框架有什么比说Moq更好的地方

测试中使用的术语可能会有点混淆。解释不同概念之间差异的最佳来源是Martin Fowler。总之,fake是一个描述存根和mock的通用术语。

mock中的术语可能会让人困惑,有时甚至很不直观

因此,许多人提出了一个更简单的新术语,即只有赝品仿制品存根

Fake是所有可能的测试双打的通用术语,无论它们来自何处,如何使用

除此之外,伪造品只在一个维度上被区分:它们是否影响测试结果;或者,换句话说:您是否必须为伪对象设置返回值(在测试执行期间以某种方式使用),或者它是一个“静默”对象,仅用于实现某些依赖性。

存根就是那个“静默”对象

Mock它积极参与测试执行

除此之外,没有进一步的区别——这当然有其历史价值,但现在在很大程度上是违反直觉和学术的,这有点混淆了测试驱动开发的真正重要概念

关于MoqFakeItEasy之间的比较:从概念角度来看,这两个框架基本上是相同的的差异仅在于API和术语上的差异


Thomas

说清楚,我创建了FakeiTasy,所以我肯定不会说一个框架是否比另一个更好,我能做的是指出一些差异并激发我创建FakeiTasy的动机。从功能上讲,最低起订量和假货之间没有重大区别

Fakeitesy没有“可验证的”或“预期”,它有断言,但是,这些断言总是在测试的最后明确说明,我相信这会使测试更容易阅读和理解。它还帮助初学者避免多次断言(他们会对许多调用或模拟对象设置期望)

我以前使用过Rhino Mock,我非常喜欢它,尤其是在引入AAA语法之后,我更喜欢Moq的流畅API。我不喜欢Moq的“mock object”,在这里你必须使用mock。object无处不在,我更喜欢Rhino方法和“natural”mock。每个实例看起来和感觉上都像是伪造类型的普通实例。我想充分利用这两个世界,我也想看看当我有绝对自由的双手时,我能用语法做些什么。就个人而言,我(显然)认为我创造的东西是世界上最好的东西的完美结合,但当你站在巨人的肩膀上时,这很容易

正如这里所提到的,其中一个主要区别是术语上的差异,FakeItEasy最初是为了向初学者介绍TDD和mocking而创建的,在我看来,预先担心mocks和stubs之间的差异(在Rhino中必须这样做)不是很有用

我已经把很多注意力放在异常消息上,只要看一条异常消息,就可以很容易地判断测试中什么地方出错

Fakeitesy有一些其他框架没有的可扩展性特性,但这些特性还没有很好的文档记录

FakeiTasy(希望)在模拟具有构造函数参数的类时更强一些,因为它有一种机制来解析要使用的伪值。您甚至可以通过在测试项目中实现DummyDefinition(Of T)类来指定自己的虚拟值定义,FakeiTasy将自动获取该类

语法是一个明显的区别,哪一个更好在很大程度上取决于品味


我确信我现在已经忘记了很多其他的差异(公平地说,我自己从来没有在生产中使用过最小起订量,所以我对它的了解是有限的),但我确实认为这些是最重要的区别。

从我的观点来看,Fake不会取消Moc,例如,我使用Dev Magic Fake来伪造DAL和业务层,同时我在MVC中使用Mock来伪造HTTPContext

var repoistory = new FakeRepository<ProductTypeForm, VendorForm>();
            repoistory.Save(productTypeForm);
            this.FillDropDown(new FakeRepository<VendorForm>());
var repostory=new FakeRepository();
repoistory.Save(productTypeForm);
this.FillDropDown(新FakeRepository());
在前面的代码中,Dev Magic Fake将保存ProductTypeForm并从Dev Magic Fake检索VendorForm并将其链接到ProductTypeForm,此保存操作可以是永久性的

有关Dev Magic Fake的更多信息,请参阅CodePlex上的:

为了测试这个方法,我们必须模拟HTTP上下文

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var context=newmock();
var request=newmock();

因此,我使用fake和mock

Lol任何带有mock或fake标签的问题都应该弹出一个“你读过Martin Fowler的文章吗”弹出窗口:p该链接确实对这些术语有最好的定义这篇文章很棒,但他可以在格式化、跨越整个屏幕长度的简单html、未着色代码方面做一些工作。。。这真的让人难以阅读+1-马丁·福勒是上帝,简单明了。我从他的网站上学到了很多。事实上,不,根据福勒的文章,“假”不是存根和模拟的通用术语,而是第三种“双重测试”(还有第四种,即“虚拟”)。要了解完全不同的模拟和存根,请看微软moles框架()。Moles还允许模仿静态、密封和第三方类。+1没有什么能比得上作者的帖子:-)谢谢