TDD:使用Moq进行Unit Test

什么时候使用Moq

对于下面的代码

public class ProductBusiness
{
    public void Save()
    {
        try
        {
            var repository = new ProductRepository();
            resository.Save();
        }
        catch(AException ae)
        {
            ...
        }
        catch(BException be)
        {
            ...
        }
    }
}

如果我们要对ProductBusiness.Save()方法进行UT,那么该怎么做才能让UT应该包含所有的path,即产生不同的exception?

是使用Moq的时候了。

怎么使用Moq进行单元测试

首先,我们要修改我们的代码设计,使其更容易被测试,即所谓的Test Driven Development.

因为我们要测试的是ProductBusiness.Save(),因此我们应该把它与ProductRepository的逻辑进行分离。

 public class ProductBusiness
{
    public void Save(IProductRepository repository)
    {
        try
        {
            resository.Save();
        }
        catch(AException ae)
        {
            ...
        }
        catch(BException be)
        {
            ...
        }
    }
}

public interface IProductRepository
{
    bool Save();
    bool Delete();
    bool Update();

    IProduct Get(int id);
}

public interface IProduct
{
    int Id {get; set;}

    string Name { get; set; }

}

我们通过参数把ProductRepository传给Save,而不是在里面new。同时,把ProductRepository变成了一个接口。

这样,我们可以使用Moq mock出一个ProductRepository,传给ProductBusiness.Save。虽然IProductRepository有四个方法,但是我们在测试ProductBusiness.Save的时候,只需要IProductRepository的Save方法。Moq也可以使我们仅mock该接口的这一个方法。

[TestMethod]
public void SaveTest()
{
    var productBusiness = new ProductBusiness();

    Mock<IProductRepository> mockRepo = new Mock<IProductRepository>();
    mockRepo.Setup<bool>(obj => obj.Save()).Throws(new AException("Mock AException"));

    productBusiness.Save(mockRepo.Object);

}

在UT的第二行,我们创建了一个Mock<IProductRepository>对象,然后第三行,我们改变了Save的behavior,即强制抛出一个AException。

第四行里,我们把这个mock对象传递给了productBusiness.Save()作为参数。

注意,mockRepo是一个IProductRepository的wrapper,mockRepo.Object才是真正的改变了Save方法的behavior的IProductRepository对象。

Moq的更多用法,请参考https://github.com/Moq/moq4

时间: 2024-11-03 11:12:18

TDD:使用Moq进行Unit Test的相关文章

20172317 2017-2018-2 《程序设计与数据结构》实验二报告

20172317 2017-2018-2 <程序设计与数据结构>实验二报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 蒋子行 学号: 20172317 实验教师: 王志强 实验日期: 2018年4月22日 必修/选修: 必修 实验内容Experiment content Master the basic of unit testing and TDD(Test-driven development) Understand and master 3 vital elem

[转]Clean Code Principles: Be a Better Programmer

原文:https://www.webcodegeeks.com/web-development/clean-code-principles-better-programmer/ ----------------------------------------------------------------- "My code is working well, the website I built is looking great, and my client is happy. So why

Unit Tests Tool - &lt;What is “Mock You”&gt; The introduction to moq #Reprinted#

From: http://www.cnblogs.com/wJiang/archive/2010/02/21/1670632.html Moq即Mock You Framework,故名思意是一个类似Mockery,JMock的Mock框架. 是google上的一个.net开源项目 项目扉页 相关下载 http://code.google.com/p/moq/ http://code.google.com/p/moq/downloads/list 先说说一般的使用Mock进行测试的基本过程: M

ASP.Net MVC3 - The easier to run Unit Tests by moq #Reprinted#

From: http://www.cnblogs.com/techborther/archive/2012/01/10/2317998.html 前几天调查完了unity.现在给我的任务是让我调查Moq. 以下是自己找了资料,总结并实践的内容.如果有表述和理解错误的地方.恳请指正. 什么是Moq? Moq(英语发音是Mock-you 或者只是mock)是一个针对.Net开发的模拟库,它从开始就完全充分利用了.NET3.5(LINQ表达式树)和C#3.0的新特性(lambda表达式).它的目标是让

TDD学习笔记【六】一Unit Test - Stub, Mock, Fake 简介

这篇文章简介一下,如何通过 mock framework,来辅助我们更便利地模拟目标对象的依赖对象,而不必手工敲堆只为了这次测试而存在的辅助类型. 而模拟目标对象的部分,常见的有 stub object, mock object, fake object,本文也会简单介绍一下三者的不同点,并且通过实例,帮助读者快速的 pick up 实战经验. 安装与范例说明 本文的范例,使用 VS2013 为开发工具,mock framework 则是使用 Rhino.Mocks,通过 IoC 的方式,由构造

Moq/moq4

moq The most popular and friendly mocking framework for .NET var mock = new Mock<ILoveThisFramework>(); // WOW! No record/replay weirdness?! :) mock.Setup(framework => framework.DownloadExists("2.0.0.0")) .Returns(true) .AtMostOnce(); /

我看TDD测试驱动开发

今天在实验室给大家介绍了一下TDD和Docker,大家对TDD都比较感兴趣,包括老板,也问了一些问题. 还是从头来说TDD吧,TDD作为敏捷开发领域的领头军,充满魅力,同时也充满争议.一切从三大军规说起: 除非这能让失败的单元测试通过,否则不允许去编写任何的产品代码. 只允许编写刚好能够导致失败的单元测试. (编译失败也属于一种失败) 只允许编写刚好能够导致一个失败的单元测试通过的产品代码. 上面这三个是网上找的中文翻译,回来后,我还是决定要把英文原文找出来,相对与上面三句拗口蹩脚的翻译,我相信

TDD学习笔记【三】---是否需针对非public方法进行测试?

前言 在Visual Studio 2012 中,针对Unit Test 的部分,有一个重要的变动: 原本针对「测试对象非public 的部分」,开发人员可通过Visual Studio 2010 自动产生的accessor ??来进行测试.但在Visual Studio 2012 中,将此功能移除了. Accessor ??其背后的原理,是将对象通过很「脏」的反射方式,把对象内所有的东西public 出来.并且Visual Studio 在更新对象后,进行与设计测试时,会帮你做同步产生acce

TDD学习笔记【二】---单元测试简介

大纲 Testing 的第一个切入点:单元测试. 本篇文章将针对单元测试进行简介,主要内容包含了5W: Why What Where Who When 而How 的部分,属于实现部分,将于下一篇文章介绍工具与简单的范例. 最后会提到测试用例所代表的意义与其重要性. 前言 单元测试,是开发人员最该写的测试程序,却也是最容易被忽略的测试. 大家常碰到的测试相关问题是: 往往一堆人写测试程序时,自以为是在写单元测试,却压根就不是单元测试,而是集成测试. 生产代码是我写的,如果测试程序也是我写,那有什么