【问题标题】:what is a good mocking framework to start mocking with in asp.net MVC? (novice and probably not a hardcore mocker)在 asp.net MVC 中开始模拟的好的模拟框架是什么? (新手,可能不是铁杆嘲笑者)
【发布时间】:2011-05-17 21:19:55
【问题描述】:

我想在我的单元测试中使用模拟。

到目前为止,我更多的是编程“测试”而不是“单元测试”,因为我测试了整个程序流程,但阅读讨论我可以不时看到模拟对象的美。

但是,环顾四周,有很多可用的框架,我想确保从一个好的框架开始,因为我只想花时间学习一次模拟框架。

所以正如我在标题中所说,我是一个 mocking 新手,使用 asp.net mvc,并且不认为我会成为一个铁杆 mocker,研究一个 mocking 框架的边缘。

为了让您了解我喜欢 IOC 框架中的什么,我喜欢 unity 和 structuremap。

米歇尔

【问题讨论】:

    标签: c# asp.net-mvc frameworks mocking


    【解决方案1】:

    我会推荐Moq。我之前尝试过 Rhino,但我个人觉得 Moq API 更流畅。

    【讨论】:

    • +1 我认为 Moq API 对新手非常友好,而且非常容易上手。我和朋友讨论过,他们认为 Rhino 更强大,可能是这样,但在使用它们之后,我发现 Moq 相对容易直接跳入。
    • @Pandincus 同意。我最初是从 Rhino 开始的,然后尝试了 Moq,所以我都使用了。我和 Moq 住在一起。我只是发现 Moq API 比 Rhino 更容易流动。
    【解决方案2】:

    我已将Rhino MocksMoq 用作ASP.NET MVC 项目的一部分,并取得了巨大成功。虽然过去这些框架有很大不同,但多年来它们的功能集已经趋于一致,因此任何一个都是不错的选择。

    由于您专门针对 MVC,因此您也应该考虑 what Phil Haack has to say

    【讨论】:

    • @Michel 查看这篇文章中的 cmets,因为 Oran(Rhino Mocks 的作者)和 Kzu(Moq 的作者)来回讨论了一段时间。如果你问我,那就是磨铁。
    【解决方案3】:

    我推荐Moq

    假设你有一个类MyClass,定义如下:

    public class MyClass{
    
        private IMyDependency dependency;
    
        public MyClass(IMyDependency dependency){
            this.dependency = dependency;
        }
    
        public void DoSomething(){
            //invoke a method on the dependency
            this.dependency.DoWork();
        }
    
    }
    

    IMyDependency 声明如下:

    public interface IMyDependency{
        void DoWork();
    }
    

    现在使用 Moq,您可以测试依赖项是这样调用的:

    public void DoSomethingWillInvokeDoWorkCorrectly()
    {
        var mock = new Mock<IMyDependency>();
        mock.Setup(imd => imd.DoWork()).Verifiable();
        var sut = new MyClass(mock.Object);
        sut.DoSomething();
        //Verify that the mock was called correctly
        mock.Verify();
    }
    

    现在这是一个非常简单的例子,所以让我们来加点趣味。

    公共类 MyClass2{

        private IMyDependency2 dependency;
    
        public MyClass2(IMyDependency2 dependency){
            this.dependency = dependency;
        }
    
        public void DoSomething(int i){
            //invoke a method on the dependency
            this.dependency.DoWork(i * 2);
        }
    
    }
    

    IMyDependency2 声明如下:

    public interface IMyDependency2{
        void DoWork(int i);
    }
    

    测试是否将正确的参数传递给依赖项的测试方法可能如下所示:

    public void DoSomethingV2WillInvokeDoWorkCorrectly()
    {
        var mock = new Mock<IMyDependency2>();
        int parameter = 60;
        mock.Setup(imd => imd.DoWork(It.Is<int>(i => i == 2 * parameter)).Verifiable();
        var sut = new MyClass2(mock.Object);
        sut.DoSomething(parameter);
        //Verify that the mock was called correctly
        mock.Verify();
    }
    

    如您所见,Setup 方法现在对传递给DoWork 的参数添加了一个约束,表示它是一个int,其值必须是parameter 变量值的两倍。

    【讨论】:

    • 感谢您的回答。有趣的是,大多数示例都没有任何设置,只使用“期望”,但是当我开始使用它时,它会自动清除。
    猜你喜欢
    • 2010-09-06
    • 2013-07-04
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多