为啥我的 Rhino Mocks Partial Mock 方法调用没有被模拟?

Posted

技术标签:

【中文标题】为啥我的 Rhino Mocks Partial Mock 方法调用没有被模拟?【英文标题】:Why is my RhinoMocks PartialMock method call not being mocked?为什么我的 Rhino Mocks Partial Mock 方法调用没有被模拟? 【发布时间】:2011-08-08 16:15:44 【问题描述】:

我正在创建一个部分模拟来测试基类的受保护辅助方法。我对是否应该存在受保护的方法或者它是否应该是注入依赖项的辩论不太感兴趣,因为我真的很想看到下面的过程工作。

EnumerationServiceBase_Accessor 是 VSTS 2010 生成的私有访问对象。除了第 17 行没有有效地设置拦截对 CreateNewContextResponse(request) 调用的期望之外,下面的所有内容都运行良好,这是在播放期间由 partialTarget.EnumerateOp(request) 调用的受保护方法。相反,正在调用基类的实际实现。我在这里做错了什么?

1  PrivateObject p = new PrivateObject(mocks.PartialMock<EnumerationServiceBase>(contextManager, requestValidator, configProvider, faultProvider, logger));
2  EnumerationServiceBase_Accessor partialTarget = mocks.PartialMock<EnumerationServiceBase_Accessor>(p);
3
4  EnumerateOpRequest request = new EnumerateOpRequest()
5  
6   Enumerate = new Enumerate()
7   
8       Item = new EnumerateNewContext()
9   
10 ;
11 
12 using (mocks.Record())
13 
14   requestValidator.Expect(r => r.ValidateEndTo(request));
15   requestValidator.Expect(r => r.ValidateMaxElements(request, allowNulls: true));
16   partialTarget.Expect(t => t.EnumerateOp(request)).CallOriginalMethod(OriginalCallOptions.CreateExpectation); 
17   partialTarget.Expect(t => t.CreateNewContextResponse(request)).Return(null);
18   contextManager.Expect(t => t.RemoveExpiredContexts());
19 
20
21 using (mocks.Playback())
22 
23   partialTarget.EnumerateOp(request);
24 

这是在 EnumerationServiceBase.cs 中实现的 EnumerateOp(request)

1  public virtual EnumerateOpResponse EnumerateOp(EnumerateOpRequest request)
2  
3      EnumerateOpResponse response = null;
4  
5      if (request.Enumerate.Item is EnumerateNewContext)
6      
7          try
8          
9              _contextManager.RemoveExpiredContexts();
10         
11         catch (Exception ex)
12         
13             _logger.Warn("We're not cleaning up contexts effectively.", ex);
14         
15 
16         _requestValidator.ValidateEndTo(request);                
17         _requestValidator.ValidateMaxElements(request, allowNulls: true);
18         response = CreateNewContextResponse(request);
19     
20     else if (request.Enumerate.Item is EnumerationContextType)
21     
22         _requestValidator.ValidateMaxElements(request, allowNulls: false);
23         response = CreateEnumerationContextResponse(request);
24     
25     else
26     
27         throw _faultProvider.GetItemNotRecognizedFault("The Enumerate.Item value was not of type EnumerateNewContext or EnumerationContextType.");
28     
29     return response;
30 

编辑:删除了不必要的信息。

【问题讨论】:

不,还没有。 =[ 刚刚意识到我无法在没有 PrivateObject 参数的情况下创建 EnumerationServiceBase_Accessor。 PartialMock 问题仍然存在。 CreateNewContextResponse 是虚拟的吗?一定是,否则Rhino.Mocks无法拦截。 是的。如此虚拟,几乎不存在! 【参考方案1】:

问题是您的CreateNewContextResponse 受到保护而You can't mock protected methods with Rhino Mocks.

【讨论】:

以上是关于为啥我的 Rhino Mocks Partial Mock 方法调用没有被模拟?的主要内容,如果未能解决你的问题,请参考以下文章

Rhino Mocks 上的 mock 和 stub 有啥区别?

Rhino Mocks - 使用 ref/out 参数模拟集合

Rhino Mocks 默认返回类型?

如何使用 Rhino Mocks 模拟任意行为?

无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类

Rhino Mocks 存根和模拟仅适用于接口?