首页 > 其他分享 >VS2012 Unit Test——Microsoft Fakes入门

VS2012 Unit Test——Microsoft Fakes入门

时间:2022-11-04 13:45:28浏览次数:93  
标签:repository VS2012 DateTime Fakes Test using ActivityService public

http://www.javashuo.com/article/p-bxxifltn-hb.html

依我我的理解单元测试就是对程序的小单元进行测试,一个测试不该包含两个或更多单元,整体而言大多都是对方法、属性的编码正确性进行验证。可是每每一个方法又会调用其余的方法或属性,我这里暂称之为外部依赖,于是外部依赖会影响程序单元的测试结果,要避免这样的状况就不得不使用一些外部依赖的模拟进行隔离(Isolate),本文就是使用了Microsoft Fakes,固然还有其余更为流行的框架能够选择使用(Moq、Rhino Mocks、Type Mock)

Fakes有两种形式:stub 和 shim。具体的介绍我就不啰嗦,由于我英文很差可能会表达错误误导新人。编码

个人Demo也是看了MSDN后以我的理解后进行简单的编写,若是MSDN看懂了也就不用看如下内容了,期待和我同样正在使用VS2012 MSTest进行单元测试的一块儿交流进步。url

 

1、shim

如下将模拟DateTime的Now属性,假设我如今须要在活动服务类ActivityService添加一个方法验证某个线下活动是否过时。

1. 打开VS2012,建立单元测试项目FakesTesting,我这是测试先行。重命名项目自动生成的类UnitTest1为ActivityServiceTest,将TestMethod1改成IsExpireTest(是否过时).

2. 添加代码“ActivityService service = new ActivityService();”并使用VS快捷功能为咱们建立ActivityService 类

3. 添加Fakes,因为DateTime位于System程序集,于是将添加System的Fake程序集(右键System程序集),  而后在测试类“using System.Fakes;”

4.  编写测试代码以下

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Fakes;
using Microsoft.QualityTools.Testing.Fakes;

namespace FakesTesting.Test
{
    [TestClass]
    public class ActivityServiceTest
    {
        [TestMethod]
        public void IsExpireTest()
        {
            ActivityService service = new ActivityService();
            bool actual = service.IsExpire();
            Assert.IsFalse(actual);

            using (ShimsContext.Create())
            {
                ShimDateTime.NowGet = () => new DateTime(2014, 5, 5);
                actual = service.IsExpire();
                Assert.IsFalse(actual);
            }
        }
    }
}

5. 而后编写ActivityService类

    public class ActivityService
    {
        public DateTime BeginTime { get; set; }

        public ActivityService()
        {
            this.BeginTime = new DateTime(2014, 3, 3);  //仅做演示,无心义
        }

        public bool IsExpire()
        {
            return BeginTime >= DateTime.Now;
        }
    }

6. 运行测试经过。而后就能够把实际业务类移动到相应VS项目中,并调整命名空间。

 

2、Stub

如今假设ActivityService类有一个方法获取是否还能报名,可是它依赖于仓储IActivityRepository(只有遵循依赖反转与接口隔离原则的代码才好使用Stub填充外部依赖)提供的RegisterNumber方法。

1. IActivityRepository接口(新建IRepositories项目并添加该接口)

    public interface IActivityRepository
    {
        /// <summary>
        /// 已报名人数
        /// </summary>
        int RegisterNumber();
    }

2. 而咱们的单元测试如今不能依赖具体(实际环境中的Repository可能对测试带来影响),这时候就能使用Stub来填充该接口了,添加IRepositories引用,而后与上一个Demo同样的添加IRepositories的Fakes程序集。

3. 在测试类中添加Using代码

using IRepositories;
using IRepositories.Fakes;

4. 编写测试代码

        [TestMethod]
        public void CanRegisterTest()
        {
            StubIActivityRepository repository = new StubIActivityRepository();
            ActivityService service = new ActivityService(repository);

            //若是已报名人数小于最多可报名数量则不能再报名,断言CanRegister方法应为True
            repository.RegisterNumber = ()=> 20;
            bool actual = service.CanRegister();
            Assert.IsTrue(actual);

            //若是已报名人数大于等于最多可报名数量则不能再报名,断言CanRegister方法应为False
            repository.RegisterNumber = () => 50;
            actual = service.CanRegister();

        Assert.IsFalse(actual);
      }



5. ActivityService代码:

    public class ActivityService
    {
        public DateTime BeginTime { get; set; }

        /// <summary>
        /// 最多可报名数量
        /// </summary>
        private int maxCount = 50;
        private IActivityRepository repository;

        public ActivityService()
        {
            this.BeginTime = new DateTime(2014, 3, 3);  //仅做演示,无心义
        }

        public ActivityService(IActivityRepository repository)
        {
            // TODO: Complete member initialization
            this.repository = repository;
        }
        
        public bool IsExpire()
        {
            return BeginTime >= DateTime.Now;
        }

        public bool CanRegister()
        {
            return repository.RegisterNumber() < this.maxCount;
        }
    }

 

总结

stub用于咱们可控的代码,shim用于不可控的,例如.NET Framework以及第三方类库等。

标签:repository,VS2012,DateTime,Fakes,Test,using,ActivityService,public
From: https://www.cnblogs.com/Dongmy/p/16857465.html

相关文章

  • t-testdisk 分区恢复
    安装配置好yum源,直接使用yum​​yuminstalltestdisk-y​​​安装好之后直接运行​​testdisk​​或者​​testdisk/dev/sdx​​进入如下界面,选择​​create​​进行日......
  • Atcoder Beginner Contest 271(A~G)
    省流:赛时F假了。赛时A转进制;B简单vector。C简单贪心模拟,大概就是能走就走,不能走就先不走(较大)或者存起来(较小),最后走存起来的。挂了3发,自闭了。D第一眼看成了......
  • Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) D
    D.ExplorerSpace我们考虑一个性质就是他最多就是找到一条k/2的最短路径然后回来这样是肯定是包含最优解的这个观察第二个样例我们将其改变一下要是我们一半的长度......
  • pytest框架学习随想
    前言:最近一段时间在学习pytest框架,在学习过程中也遇到了很多的问题,简单跟大家分享一下1.什么是单元测试框架:(1).单元测试框架:指在软件开发当中,针对软件的最小单位(......
  • pytest运行测试用例时,控制台不打印警告信息
    使用pytest执行用例,控制台显示警告信息: 解决方法:新增pytest.ini文件,文件内容:[pytest]addopts=-pno:warnings 再次运行测试用例,控制台打印无警告信息......
  • 2022 China Collegiate Programming Contest (CCPC) Guilin Site
    2022ChinaCollegiateProgrammingContest(CCPC)GuilinSiteALily签到题。直接暴力,求一下对于每个点附近是不是有L,没有就.C.ArrayConcatenation分析思路1:可......
  • 关于java.lang.IllegalArgumentException: Unknown URL content://com.example.databa
    在学习《Android第一行代码》第八章的ProviderTest项目的时候,运行之后点击“AddToBook”按钮,出现如下问题:java.lang.IllegalArgumentException:UnknownURLcontent://......
  • 【Python_pytest】出错:PytestAssertRewriteWarning: Module already imported so cann
    pytest测试时pytest_check模块错误错误信息:PytestAssertRewriteWarning:Modulealreadyimportedsocannotberewritten:pytest_checkself._mark_plugins_for_......
  • AtCoder Regular Contest 065
    ARC064C,E都是简单题,D猜结论也没啥意思,就不写了。ARC065还是比较好的。D-Connectivity给定\(n\)个点的无向图,有两组连边,互相独立。询问每个点通过两组连边都......
  • AtCoder Regular Contest 136 D Without Carry
    AtCoder传送门洛谷传送门一眼。将\(a\)中每个数用前导零补到\(6\)位,题目相当于问所有\(i,j\),\(a_i\)的每一位加\(a_j\)的这一位都不超过\(9\)的\((i,j)\)......