.net C#模拟框架-简单,但有信息异常

.net C#模拟框架-简单,但有信息异常,.net,mocking,.net,Mocking,到目前为止,我一直在使用NUnit.mock来隔离我的类,但我对它给我的反馈缺乏感到恼火。所以我一直在四处寻找替代品,但一无所获 犀牛嘲弄:无法理解。每件事都必须以完全不同的方式完成,使得测试代码实际上不可读 Moq:无法了解如何模拟属性获取程序。有一些样品,但我试用时它们不起作用 从我收集的资料来看,这些似乎是最受欢迎的。在我去尝试每一个之前,我想问你们一些建议 我要找的是: 简单设计。我不想记住100条不同的语句,也不想根据我的方法是否有返回值、我的属性是否同时有getter和setter

到目前为止,我一直在使用NUnit.mock来隔离我的类,但我对它给我的反馈缺乏感到恼火。所以我一直在四处寻找替代品,但一无所获

犀牛嘲弄:无法理解。每件事都必须以完全不同的方式完成,使得测试代码实际上不可读

Moq:无法了解如何模拟属性获取程序。有一些样品,但我试用时它们不起作用

从我收集的资料来看,这些似乎是最受欢迎的。在我去尝试每一个之前,我想问你们一些建议

我要找的是:
  • 简单设计。我不想记住100条不同的语句,也不想根据我的方法是否有返回值、我的属性是否同时有getter和setter或只是其中的一条、是否是满月等来使用哪一条语句
  • 详细的反馈。如果我的测试失败,我想知道什么方法调用丢失了或太多了。我想知道哪个调用的参数错误。等等
我的背景是C#2.0。我对较新的.NET版本中的概念仍然相当不熟悉。因此,一个不需要这些东西的框架将是一个额外的好处

多谢各位


编辑:我终于明白了为什么我的Moq测试不起作用。这与最低起订量无关,我现在正在进一步评估。到目前为止看起来非常好…

我使用Moq,我更喜欢实现,而不是一些其他模拟框架的重放方法-我发现它更自然

你对房产有什么问题?要模拟从属性返回值,只需

mock.Setup(foo => foo.Name).Returns("bar")
简单设计

Moq有一个流畅的界面,代码可以很有表现力,非常漂亮。例如:

  • 向对象中注入模拟

    mockView = new Mock<IView>();
    mockModel = new Mock<IModel>();
    realPresenter = new Presenter(mockView.Object, mockModel.Object);
    
  • 详细反馈

    我发现失败反馈非常有用,我通常可以很快发现问题。假设您希望调用具有特定参数值的方法,但该方法失败

    测试“MyProject.MyTest”失败: 最小起订量例外情况: 预期至少对模拟进行一次调用,但从未执行过:v =>v.DoSomething(“某物”)>未配置任何设置

    执行的调用:View.DoSomething(“SomethingElse”) 在 Moq.Mock.ThrowVerifyException(MethodCall 应为IEnumerable
    1设置,
    IEnumerable
    1实际调用,表达式 表达式,Times,Int32 呼叫计数)在 Moq.Mock.VerifyCalls(拦截器 targetInterceptor,方法调用 预期、表达式、时间 时间)在最小起订量模拟验证[T](模拟 模拟,表达式<代码>1表达式,次数 时间,字符串失败消息)在 Moq.Mock1.验证(表达式'1 表达式)MyTest.cs(118,0):

    这是非常好地放在一起,一直是唯一的参考,我需要到目前为止

    的设计具有简单性(可发现性)和非常重要的反馈,这是自始至终的两个主要设计目标

    另一个主要设计目标是测试的可读性

    你说你不想记住100条不同的语句?好吧,好吧,Fakeetisy的用途不超过你一只手上的手指

    例如,配置和断言是通过相同的语句完成的:

    // Creating a fake
    var foo = A.Fake<IFoo>();
    
    // Configuration
    A.CallTo(() => foo.Bar()).Returns("a value");
    
    // Assertion
    A.CallTo(() => foo.Bar()).MustHaveHappened();
    
    //创建假文件
    var foo=A.Fake();
    //配置
    A.CallTo(()=>foo.Bar())。返回(“一个值”);
    //断言
    A.CallTo(()=>foo.Bar()).musthavecoursed();
    
    这怎么可能不会变成一个主观/有争议的“我最喜欢的是最好的?”您已经消除了两个最强大和最流行的模拟框架。还剩下什么?(Typemock:)PS-现代模拟框架最强大的功能将包括lambdas、Func和泛型,以支持流畅的接口。我认为你无法坚持使用.NET 2.0,也无法找到一个不使用这些功能的框架。NUnit.Mock不是供公众使用的,它在开发时由NUint内部使用,不受支持。根据他们的文件!莫克舞真是太棒了。@Swersky:不,我不是在找每个人最喜欢的。我正在寻找一些建议,以解决迄今为止我所尝试的框架所遇到的问题正如我所说的,C#2.0水平将是一种奖励——这不是一项要求……我可以理解否决票,但这对我来说似乎是一个相当好的问题,因为你是在征求建议,而不是“哪一个是最好的?”这也是一个很好的话题,IMHO,所以请接受我的+1。@Pondium谢谢!我喜欢Moq。作为一个侧面,这显然不是C#2.0级别,因为它使用lambda表达式。但是,它消除了lambda表达式的许多“韧性”,而其他框架正是因为没有参数传递给lambda。在你做了两次之后,你要学会记住键入()=>我已经研究过了。不幸的是,所有当前版本都需要.NET 4.0,而我只有Visual Studio 2008。1.0.0.5版可以与.NET 3.5一起使用。这是一个较旧的版本,因此它不包含所有新功能,但它仍然得到维护,并将对其进行错误修复。NET3.5是一个不再开发的框架。是的。但我使用哪种.NET框架不是我的选择。。。
    // Creating a fake
    var foo = A.Fake<IFoo>();
    
    // Configuration
    A.CallTo(() => foo.Bar()).Returns("a value");
    
    // Assertion
    A.CallTo(() => foo.Bar()).MustHaveHappened();