温莎和犀牛的自动模拟容器

4

我希望使用Windsor进行自动模拟,以便我可以做类似以下的操作:

  _controller = _autoMockingContainer.Create<MyControllerWithLoadsOfDepdencies>();

以前在 AyendeRhino库中有温莎自动模拟容器。但是它似乎不再维护,因此依赖项有点旧(它使用的是Castle Windsor 2,但我们需要引用2.5),导致DLL地狱。
是否有可行的替代方案?我尝试从犀牛测试中提取相关类,但这比我能处理的要复杂得多。
3个回答

6

感谢@mookid8000的链接和同事的帮助,我创建了这个……似乎解决了问题。

 public abstract class TestBase
    {
        static readonly WindsorContainer _mockWindsorContainer;

        static TestBase()
        {
            _mockWindsorContainer = new WindsorContainer();
            _mockWindsorContainer.Register(Component.For<LazyComponentAutoMocker>());
        }

        protected static T MockOf<T>() where T : class
        {
            return _mockWindsorContainer.Resolve<T>();
        }

        protected static T Create<T>()
        {
            _mockWindsorContainer.Register(Component.For<T>());
            return _mockWindsorContainer.Resolve<T>();
        }

    }

    public class LazyComponentAutoMocker : ILazyComponentLoader
    {
        public IRegistration Load(string key, Type service, IDictionary arguments)
        {
            return Component.For(service).Instance(MockRepository.GenerateStub(service));
        }
    }

5
请查看如何使用NSubstitute将Windsor制作成自动模拟容器:这里。通过注册一个ILazyComponentLoader,可以很容易地扩展Windsor以实现所需的功能,该组件加载器使用Rhino Mocks生成模拟实例而不是NSubstitute。更新:我最近在我的博客上展示了Windsor如何实现使用Rhino mocks进行自动模拟。

那么唯一的方法就是使用不同的模拟框架吗? - Dan
1
不,我想你可能误解了我的意思 - 你正在使用Windsor,对吧?这个例子展示了如何轻松地使用任何mocking框架与Windsor一起,以便自动注入mocks。 - mookid8000
1
很棒的回答。那位博客作者觉得这个答案不值得花时间去写,但它确实非常棒,尽管非常简单。感谢分享。 - Bronumski

1

Moq Contrib为Windsor + Moq提供了一个自动模拟容器。它似乎是最新的。显然,您将需要使用Moq而不是Rhino.Mocks。


那么唯一的方法就是使用不同的模拟框架了吗? - Dan
@Dan:一点也不,Moq Contrib是有维护的,而Rhino的自动模拟容器则没有。你也可以获取Rhino的代码并进行更新。 - Mauricio Scheffer
是的,我确实尝试在Rihno.Testing中升级Castle,这比我想象的要复杂。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接