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 }

 

posted @ 2013-04-12 15:25  easy5  阅读(376)  评论(0编辑  收藏  举报