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

时间:2011-06-24 09:59:37

标签: unit-testing castle-windsor rhino rhino-commons automocking

我想与温莎进行自动锁定,以便我可以做类似

的事情
  _controller = _autoMockingContainer.Create<MyControllerWithLoadsOfDepdencies>();

Ayende's Rhino个库中曾经有一个Windsor自动模拟容器。但这似乎不再维持,所以依赖有点旧(它使用Castle Windsor 2,但我们需要引用2.5),因此导致dll地狱。

有没有可行的替代方案?我尝试从rhino测试中提取出相关的类,但是我可以处理的更多内容。

3 个答案:

答案 0 :(得分: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));
        }
    }

答案 1 :(得分:5)

了解如何使用NSubstitute here将Windsor制作成自动模拟容器。

通过注册使用Rhino Mocks生成模拟实例而非NSubstitute的ILazyComponentLoader来扩展Windsor应该相当容易。

更新:我最近展示了Windsor如何使用Rhino模拟on my blog实现自动模拟。

答案 2 :(得分:1)

Moq Contrib有一个用于Windsor + Moq的自动锁定容器。它似乎是最新的。显然,你必须使用Moq而不是Rhino.Mocks。