• TDD:几个Mock框架


    View Code
      1 /*
      2  * stub和mock的微妙区别:
      3  * stub对象不会使测试失败
      4  * mock对象只是替换外部依赖,使测试中的对象可以运行并以测试。
      5  * mock对象可以使测试失败,同时可以验证两个对象之间的交互是否按照期望的方式进行。
      6  */
      7 using Mocking.Model;
      8 using Mocking.ModelTest.Stubs;
      9 using Mocking.ModelTest.Mocks;
     10 
     11 using NUnit.Framework;
     12 using NUnit.Mocks;
     13 
     14 using Rhino.Mocks;
     15 
     16 
     17 
     18 namespace Mocking.ModelTest
     19 {
     20     #region 手动写Stub(存根)、Mock(模拟)
     21 
     22     [TestFixture]
     23     public class HolidayRequestServiceHandRolledTest
     24     {
     25       
     26         [Test()]
     27         public void The_HolidayRequestService_Will_Approve_A_HolidayRequest_ThatIs_Granted_By_The_Validator()
     28         {
     29             HolidayRequest holidayRequest = new HolidayRequest();
     30             AlwaysValidHolidayRequestValidator validator = new AlwaysValidHolidayRequestValidator();
     31             StubHolidayRequestRepository stubHolidayRequestRepository = new StubHolidayRequestRepository();
     32 
     33             //需要测试的类
     34             HolidayRequestService holidayRequestService = new HolidayRequestService(validator, stubHolidayRequestRepository);
     35             holidayRequest.Approved = false;
     36             holidayRequestService.Submit(holidayRequest);
     37 
     38             Assert.AreEqual(true, holidayRequest.Approved);
     39         }
     40 
     41         [Test()]
     42         public void AHolidayRequestThatIsApprovedByTheRequestServiceIsSavedByTheRepsitory()
     43         {
     44             HolidayRequest holidayRequest = new HolidayRequest();
     45             AlwaysValidHolidayRequestValidator validator = new AlwaysValidHolidayRequestValidator();
     46             MockHolidayRequestRepository mockHolidayRequestRepository = new MockHolidayRequestRepository();
     47 
     48             //需要测试的类
     49             HolidayRequestService holidayRequestService = new HolidayRequestService(validator, mockHolidayRequestRepository);
     50             holidayRequestService.Submit(holidayRequest);
     51 
     52             Assert.AreEqual(holidayRequest, mockHolidayRequestRepository.HolidayRequestSaved);
     53         }
     54 
     55         
     56     }
     57 
     58     #endregion
     59 
     60     #region 使用nunit.mock
     61     [TestFixture]
     62     public class HolidayRequestServiceHandRolledUnitMockTest
     63     {
     64         [Test()]
     65         public void The_HolidayRequestService_Will_Approve_A_HolidayRequest_ThatIs_Granted_By_The_Validator()
     66         {
     67             HolidayRequest holidayRequest = new HolidayRequest();
     68 
     69             DynamicMock holidayRequestValidatorMock = new DynamicMock(typeof(IHolidayRequestValidator));
     70             DynamicMock holidayRequestRepositoryMock = new DynamicMock(typeof(IHolidayRequestRepository));
     71 
     72             holidayRequestValidatorMock.ExpectAndReturn("CanGrant", true, holidayRequest);
     73  
     74             IHolidayRequestValidator holidayRequestValidator = (IHolidayRequestValidator)holidayRequestValidatorMock.MockInstance;
     75             IHolidayRequestRepository holidayRequestRepository = (IHolidayRequestRepository)holidayRequestRepositoryMock.MockInstance;
     76            
     77             //需要测试的类
     78             HolidayRequestService holidayRequestService = new HolidayRequestService(holidayRequestValidator, holidayRequestRepository);
     79             holidayRequest.Approved = false;
     80             holidayRequestService.Submit(holidayRequest);
     81 
     82             Assert.AreEqual(true, holidayRequest.Approved);
     83         }
     84 
     85         [Test()]
     86         public void AHolidayRequestThatIsApprovedByTheRequestServiceIsSavedByTheRepsitory()
     87         {
     88             //HolidayRequest holidayRequest = new HolidayRequest();
     89 
     90             //DynamicMock holidayRequestValidatorMock = new DynamicMock(typeof(IHolidayRequestValidator));
     91             //DynamicMock holidayRequestRepositoryMock = new DynamicMock(typeof(IHolidayRequestRepository));
     92             //IHolidayRequestValidator holidayRequestValidator = (IHolidayRequestValidator)holidayRequestValidatorMock.MockInstance;
     93             //IHolidayRequestRepository holidayRequestRepository = (IHolidayRequestRepository)holidayRequestRepositoryMock.MockInstance;
     94 
     95             ////需要测试的类
     96             //HolidayRequestService holidayRequestService = new HolidayRequestService(holidayRequestValidator, holidayRequestRepository);
     97             //holidayRequestService.Submit(holidayRequest);
     98             ////Assert.AreEqual(holidayRequest, holidayRequestRepository.HolidayRequestSaved);
     99         }
    100     }
    101 
    102 
    103     #endregion
    104 
    105     #region 使用Rhino.Mocks中的stub、mock
    106     /// <summary>
    107     /// 使用Rhino.Mocks
    108     /// </summary>
    109     [TestFixture]
    110     public class HolidayRequestServiceHandRolledRhinoMocksTest
    111     {
    112         [Test()]
    113         public void The_HolidayRequestService_Will_Approve_A_HolidayRequest_ThatIs_Granted_By_The_Validator()
    114         {
    115             HolidayRequest holidayRequest = new HolidayRequest();
    116 
    117             Rhino.Mocks.MockRepository mocks = new Rhino.Mocks.MockRepository();
    118             var validator = mocks.Stub<IHolidayRequestValidator>();  //使用反射创建该类实例
    119             var stubHolidayRequestRepository = mocks.Stub<IHolidayRequestRepository>();
    120 
    121             using (mocks.Record()) //设置存根类的方法被调用时该存根类的响应方式
    122             {
    123                 //为stub(存根)设置返回值
    124                 SetupResult.For(validator.CanGrant(holidayRequest)).Return(true);
    125             }
    126 
    127             using (mocks.Playback())
    128             {
    129                 //需要测试的类
    130                 HolidayRequestService holidayRequestService = new HolidayRequestService(validator, stubHolidayRequestRepository);
    131                 holidayRequest.Approved = false;
    132                 holidayRequestService.Submit(holidayRequest);
    133                 Assert.AreEqual(true, holidayRequest.Approved);
    134             }
    135 
    136         }
    137 
    138         [Test()]
    139         public void AHolidayRequestThatIsApprovedByTheRequestServiceIsSavedByTheRepsitory()
    140         {
    141             HolidayRequest holidayRequest = new HolidayRequest();
    142 
    143             Rhino.Mocks.MockRepository mocks = new Rhino.Mocks.MockRepository();
    144             var validator = mocks.Stub<IHolidayRequestValidator>();
    145             //var mockHolidayRequestRepository = mocks.CreateMock<IHolidayRequestRepository>();
    146             var mockHolidayRequestRepository = mocks.StrictMock<IHolidayRequestRepository>();
    147 
    148             using (mocks.Record())
    149             {
    150                 //设置返回值
    151                 SetupResult.For(validator.CanGrant(holidayRequest)).Return(true);
    152 
    153                 mockHolidayRequestRepository.Save(holidayRequest);
    154                 LastCall.Repeat.Once();
    155             }
    156 
    157             using (mocks.Playback())
    158             {
    159                 //需要测试的类
    160                 HolidayRequestService holidayRequestService = new HolidayRequestService(validator, mockHolidayRequestRepository);
    161                 holidayRequest.Approved = false;
    162                 holidayRequestService.Submit(holidayRequest);
    163 
    164                 //注意:该测试没有调用断言语句,那在哪里进行验证调用????????????
    165 
    166             }
    167         } 
    168        
    169     }
    170     #endregion
    171 
    172     #region 框架Moq
    173 
    174     [TestFixture]
    175     public class HolidayRequestServiceHandRolledUsingMoq
    176     {
    177         [Test()]
    178         public void The_HolidayRequestService_Will_Approve_A_HolidayRequest_ThatIs_Granted_By_The_Validator()
    179         {
    180             HolidayRequest holidayRequest = new HolidayRequest();
    181             var holidayRequestValidator = new Moq.Mock<IHolidayRequestValidator>();
    182             var holidayRequestRepository = new Moq.Mock<IHolidayRequestRepository>();
    183 
    184             holidayRequestValidator.Setup(validator => validator.CanGrant(holidayRequest)).Returns(true);
    185 
    186             HolidayRequestService holidayRequestService = new HolidayRequestService(holidayRequestValidator.Object, holidayRequestRepository.Object);
    187 
    188             holidayRequest.Approved = false;
    189             holidayRequestService.Submit(holidayRequest);
    190 
    191             Assert.AreEqual(true, holidayRequest.Approved);
    192         }
    193 
    194         [Test()]
    195         public void AHolidayRequestThatIsApprovedByTheRequestServiceIsSavedByTheRepsitory()
    196         {
    197             HolidayRequest holidayRequest = new HolidayRequest();
    198             var holidayRequestValidator = new Moq.Mock<IHolidayRequestValidator>();
    199             var holidayRequestRepository = new Moq.Mock<IHolidayRequestRepository>();
    200 
    201             //需要测试的类
    202             HolidayRequestService holidayRequestService = new HolidayRequestService(holidayRequestValidator.Object,holidayRequestRepository.Object);
    203             holidayRequestService.Submit(holidayRequest);
    204 
    205             //Assert.AreEqual(holidayRequest, holidayRequestRepository.Object.Save());
    206         }
    207     }
    208     #endregion
    209 }
  • 相关阅读:
    互联网协议入门(二)
    互联网协议入门(一)
    careercup-扩展性和存储限制10.6
    careercup-扩展性和存储限制10.4
    careercup-扩展性和存储限制10.3
    写一个函数找到给定字符串的位置
    手工删除crfclust.bdb文件
    VirtualBox 报错VERR_VD_IMAGE_READ_ONLY
    Oracle DG测试failover和后续恢复报告
    ASM的备份集在文件系统上恢复测试
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/3016742.html
Copyright © 2020-2023  润新知