具有非接口依赖性的 AutoMocking 类...框架是否支持此功能?

AutoMocking classes with non-interface dependencies... Does a framework support this?

我正在尝试模拟一个依赖于具体 class 的 class,就像:

AutoMockContainer with support for automocking classes with non-interface dependencies

我尝试了 3 种不同的 AutoMocking 框架(Moq.Contrib 中包含的 UnityAutoMoq、AutoMoq 和 AutoMockContainer)。 None 这些框架支持为具体依赖项创建模拟。我知道 Mark Seeman 给出了一个关于如何使用 autofac 执行此操作的示例,但我不明白为什么这些框架不支持开箱即用。有没有我没有尝试过的支持这个的框架?如果没有,有人可以帮我用 Unity 做这个吗?

我和一个同事整天都在为此苦思冥想,没有找到答案,任何帮助将不胜感激。

本质上是不支持的。至少不是您上面提到的框架。自动模拟生成器策略代码如下

if (type.IsInterface || type.IsAbstract)
{
    context.Existing = GetOrCreateMock(type);
    context.BuildComplete = true;
}

Moq.Mock 使用 Castle Dynamic 代理,它无法在非虚拟类型上生成动态代理。

单独说明: 我个人认为这是有充分理由的,因为不允许在非虚拟类型上创建代理允许开发人员经常使用虚拟类型,即 abstract/interfaces。这也意味着基于接口的编程,有助于可测试性和可维护性,从而促进更好的设计。

如果您真的想要这些功能,下一步将是查看非基于代理的模拟对象框架,例如 TypeMock,它们不是免费的。