.net - Rhino Mocks stub 和模拟仅适用于接口(interface)?

标签 .net unit-testing mocking rhino-mocks stubbing

Rhino Mocks stub 和模拟仅适用于接口(interface)而不适用于具体类是否正确?我花了很长时间试图让这段代码正常工作。我没想到 stub 的 pubSubClient 总是从类中调用 Send 方法。该方法具有一些依赖性并引发异常。

[Test]
public void Test01()
{
    PubSubMessage psm = new PubSubMessage(); 
    var pubSubClient = MockRepository.GenerateStub<PubSubClient>();
    pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null);
    // actual PubSubClient Send method throws exception
    // the rest of the test is skipped...
}

但是,当我提取接口(interface)并使用 IPubSubClient 运行相同的测试时,它似乎按预期工作。

这是否意味着我必须为我想用 Rhino 模拟/ stub 的每个类提取接口(interface)?或者我在技术上或概念上遗漏了什么?

更新 :好的,看来我知道我缺少什么部分了:
Rhino Mocks 无法拦截对非虚拟方法的调用 .所以,我想我要么使用接口(interface),要么使具体类上的每个方法都是虚拟的。如果还有其他选择,请纠正我。

最佳答案

Bryan 使用部分模拟的答案是不正确的。这不是部分模拟的用途。

Jon Erickson 的回答大多是正确的:Rhino Mocks 和 Moq 不能拦截非虚拟调用,也不能拦截静态方法或属性。这意味着您不能伪造以下内容:

DateTime.Now; // static property, can't fake static property
someClass.SomeNonVirtualMethod(); // can't fake non-virtual method
sealedClass.Foo(); // can't fake anything on sealed classes
Utilities.SomeStaticMethod(); // can't fake static methods
someList.Any(); // can't fake extension methods like Linq's .Any()

正如 Jon 所说,TypeMock 可以伪造这些。

应该注意的是,还有一个额外的模拟框架可以拦截所有调用:Microsoft Moles framework .它的工作方式与 TypeMock 相同,它使用 .NET 分析器 API 来拦截调用。

Moles 是免费的(目前)。它也是测试版。痣仅适用于 Microsoft Pex tools .而且它的 API 明显不如 TypeMock 精致、优雅的 API。

关于.net - Rhino Mocks stub 和模拟仅适用于接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2388033/

相关文章:

.net - Linq - 是否有我缺少的 IEnumerable.ForEach<T> 扩展方法?

c# - 为什么 PetaPoco 从 db.Insert 一个 ID 字段 7 作为十进制返回

.net - 公开部署在 Service Fabric 群集上的服务(由内部负载均衡器处理流量分配)

python - 如何在 Python 中模拟 SendGrid 方法

python - Pytest 如何模拟依赖于其父调用参数的函数调用的副作用

node.js - 模拟 fs.readdir 用于测试

.net - nuget 提要和促销

Python 3 单元测试 : Possible to append new test_* methods?

c# - 单元测试 - 如何测试长时间运行的外部进程

c++ - std::map 的单元测试