zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    [CodeForces]Codeforces Round #429 (Div. 2) ABC(待补)
    About Me
    2018-06-14
    Codeforces Codeforces Round #484 (Div. 2) E. Billiard
    Codeforces Codeforces Round #484 (Div. 2) D. Shark
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
    Codeforces Avito Code Challenge 2018 D. Bookshelves
    Codeforces Round #485 (Div. 2) D. Fair
    Codeforces Round #485 (Div. 2) F. AND Graph
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/3016742.html
Copyright © 2011-2022 走看看