【问题标题】:How can I use Record/Playback syntax with StructureMap AutoMocker?如何在 StructureMap AutoMocker 中使用 Record/Playback 语法?
【发布时间】:2009-01-23 16:05:09
【问题描述】:

是否可以使用语法

using(_mocks.Record())
{
   //...
}
using(_mocks.Playback())
{
   //...
}

使用 StructureMap RhinoAutoMocker?

在 Jeremy Millers 的原始帖子 AutoMocker in StructureMap 2.5 中,这似乎是可能的,因为 RhinoAutoMocker 继承了 MockRepository,但在 StructureMap 的 2.5.2 版本中,这似乎以稍微不同的方式实现。

【问题讨论】:

    标签: .net tdd mocking structuremap rhino-mocks


    【解决方案1】:

    我终于使用自定义编写的 AutoMocker 和 ServiceLocator 解决了这个问题。

    public class RecordPlaybackRhinoAutoMocker<TARGETCLASS> : AutoMocker<TARGETCLASS> where TARGETCLASS : class
    {
        private RecordPlaybackMocksServiceLocator MockRepository 
        { 
            get 
            { 
                return _serviceLocator as RecordPlaybackMocksServiceLocator; 
            } 
        }
    
        public RecordPlaybackRhinoAutoMocker()
        {
            _serviceLocator = new RecordPlaybackMocksServiceLocator();
            _container = new AutoMockedContainer(_serviceLocator);
        }
    
        public IDisposable Record()
        {
            return MockRepository.Record();
        }
    
        public IDisposable Playback()
        {
            return MockRepository.Playback();
        }
    }
    
    public class RecordPlaybackMocksServiceLocator : StructureMap.AutoMocking.ServiceLocator
    {
    
        private readonly MockRepository _mocks;
    
        public RecordPlaybackMocksServiceLocator()
        {
            _mocks = new MockRepository();
        }
    
        public T PartialMock<T>(params object[] args) where T : class
        {
            return _mocks.PartialMock<T>(args);
        }
    
        public object Service(Type serviceType)
        {
            return _mocks.StrictMock(serviceType);
        }
    
        public T Service<T>() where T : class
        {
            return _mocks.StrictMock<T>();
        }
    
        public IDisposable Record()
        {
            return _mocks.Record();
        }
    
        public IDisposable Playback()
        {
            return _mocks.Playback();
        }
    }
    

    我仍然不知道是否有内置的方法可以做到这一点。但这很有效,让我免于重写 1200 个测试。

    【讨论】:

    • 你有没有找到一种“内置”的方法来做到这一点?
    • @mxmissile:我没有,但那是很久以前的事了。从那以后我就没有使用过 StructureMap AutoMpcer。很多事情都发生了变化,也许现在有更好的方法来做到这一点。
    • 我最终使用了这个解决方案,因为我想不出更好的方法。如果您不使用 SM Automocker,您使用的是什么?
    • @mxmissile:我正在做的项目现在使用 Autofac 而不是 StructureMap,所以这就是我不使用 Automocker 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2015-01-12
    • 2019-11-27
    相关资源
    最近更新 更多