Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每种主要模拟框架在现实世界中的优缺点是什么?_C#_.net_Mocking_Rhino Mocks_Moq - Fatal编程技术网

C# 每种主要模拟框架在现实世界中的优缺点是什么?

C# 每种主要模拟框架在现实世界中的优缺点是什么?,c#,.net,mocking,rhino-mocks,moq,C#,.net,Mocking,Rhino Mocks,Moq,另见“ 我正试图决定在我最近开始的一个.NET项目中使用一个模拟框架。我想加快对不同框架的研究。我最近读了这篇博文,想知道StackOverflow的读者中是否有人对框架的实际优势和注意事项有所补充 人们可以列出他们目前使用的或为自己在.NET项目中使用而调查的模拟框架的优缺点吗。我认为这不仅有助于我决定我当前的项目,而且有助于其他人在为他们的情况选择正确的框架时做出更明智的决定。我不是任何一个框架的专家,但我希望得到支持和反对我遇到的主要框架的论据: 犀牛 最小起订量 模拟型隔离器 NMoc

另见“

我正试图决定在我最近开始的一个.NET项目中使用一个模拟框架。我想加快对不同框架的研究。我最近读了这篇博文,想知道StackOverflow的读者中是否有人对框架的实际优势和注意事项有所补充

人们可以列出他们目前使用的或为自己在.NET项目中使用而调查的模拟框架的优缺点吗。我认为这不仅有助于我决定我当前的项目,而且有助于其他人在为他们的情况选择正确的框架时做出更明智的决定。我不是任何一个框架的专家,但我希望得到支持和反对我遇到的主要框架的论据:

  • 犀牛
  • 最小起订量
  • 模拟型隔离器
  • NMock
  • 鼹鼠

以及我错过的其他可用的替代方案。我还想了解由于问题而切换或停止使用产品的用户的见解。

到目前为止,我使用了Rhinomock和Moq。Moq是目前我最喜欢的,因为它的简单性是目前我所需要的。RhinoMocks功能非常强大,但我从来没有充分利用过它。

您可能需要记住,如果您需要支持多语言环境(例如VB),所有代码可配置框架(我可以直接与Moq和RhinoMocks对话)都会很痛苦(缺少)VB中的匿名委托/lambda语法。这在VisualStudio2010/VB10中更为可能,但仍然无法与漂亮的C#lambda语法相比


我们已经使用犀牛模型一年多了。 赞成者:

  • 易于创建模拟
  • 可以模拟公共和内部方法
  • 可以模拟接口或类
  • 可以创建部分模拟(仅模拟类中的特定方法)
反对:

  • 方法必须至少是内部的和虚拟的(可能会弄乱您的体系结构)
  • 逐个属性断言很难使用,尤其是在测试范围内创建的对象集合-约束语法变得复杂
  • 当录音停止,播放开始时,你必须小心
  • 仔细考虑正在模拟的调用(例如您没有看到的属性调用或非虚拟的方法)——您可能得到的错误并没有多大帮助

一般来说,我们发现使用模拟框架可以促进“白盒”测试(尤其是单元测试)。我们最终的测试验证了事情是如何完成的,而不是他们在做什么。它们对重构毫无用处,我们不得不重写它们中的大部分。

像Frank和Chris一样,我尝试了Rhinomock,然后改用Moq。我没有失望。请参阅我的博客文章系列:


编辑:注意,我通常使用存根进行基于状态的测试;我很少使用可验证的mock进行行为测试。

我没有使用所有这些框架,但我研究了rhinomock和Moq,使用Moq是因为它感觉更优雅、更简单。我使用的是trunk版本,它包含了对最近4.0 beta版中对回调施加的4参数限制的一个必备修复


我特别喜欢默认的Moq行为,它的行为不像一个严格的模拟对象,在发出意外调用时测试失败。如果您愿意,您可以将其配置为执行此操作,但我发现这需要我花费太多的时间设定期望值,而没有足够的时间进行测试。

我一点也不知道摩尔数,但我会介绍一些我知道的摩尔数(不过我确实需要一张表格)

Moq

专业人士

  • 类型安全
  • 一致接口
  • 鼓励好的设计
缺点

  • 没有它的一些竞争对手那样功能齐全
    • 它不能模仿代表
    • 它不能满足有序的期望
    • 可能还有其他我现在想不起来的事情
  • 只能模拟接口和虚拟/抽象成员
犀牛嘲弄

专业人士

  • 类型安全
  • 全功能集
  • 鼓励好的设计
缺点

  • 混乱的API。有太多不同的方法来做同样的事情,如果你把它们以错误的方式结合起来,那就行不通了
  • 只能模拟接口和虚拟/抽象成员
TypeMock隔离器

专业人士

  • 类型安全(AFAIR)
  • 你能嘲笑任何事吗
缺点

  • 非常有侵略性
  • 潜在供应商锁定
  • 不鼓励好的设计
NMock

专业人士

  • 鼓励好的设计
  • 适用于任何版本的.NET(即使是1.1)
缺点

  • 不安全
  • 只能模拟接口和虚拟/抽象成员
请注意,尤其是关于TypeMock的优点和缺点是非常有争议的。我出版了


2003年,当NMock是唯一的选项时,我开始使用NMock,然后由于其类型安全性迁移到Rhino Mocks,现在由于更简单的API而使用Moq。

我使用TypeMock,因为我在SharePoint上开发。由于TypeMock可以模拟任何东西,因此在对SharePoint Web部件、事件接收器、工作流等进行单元测试时,它被证明是一种有价值的资源

不利的一面是,TypeMock可能会很昂贵,但是有一个适用于SharePoint的软件包,其成本低于完整的TypeMock软件包。我极力推荐

我不同意的一点是,TypeMock不能让您很好地设计代码。通常,我创建的类