TDD和DI:依赖注射变得麻烦

C#,nUnit和Rhino Mocks,如果证明是适用的.

我的TDD继续尝试围绕一个复杂的功能进行测试.假设我编写一个表单,当保存时,还必须在表单中保存依赖对象…答案,以形成问题,附件(如果可用)和“日志”条目(例如“blahblah更新表单”)或“blahblah附上一个文件”).这种保存功能还可以根据在保存功能中更改形式的状态,向各种人员发送电子邮件.

这意味着为了充分测试表单的所有依赖关系的保存功能,我必须注入5到6个数据提供程序来测试这一个函数,并确保所有内容都以正确的方式发布并进行排序.在编写表单对象的多个链接构造函数以插入嘲笑的提供程序时,这很麻烦.我想我缺少一些东西,无论是重构的方式还是简单的更好的方式设置嘲弄的数据提供者.

我应该进一步研究重构方法,看看这个功能如何被简化?观察者模式如何发声,从而依赖对象检测父表单何时被保存并处理自身?我知道人们说要分解这个函数,以便它可以被测试…意味着我测试每个依赖对象的个人保存功能,而不是表单本身的保存功能,这决定了每个应该如何保存在第一名?

使用AutoMocking容器.有一个为RhinoMock写的.

想象一下,你有一个类通过构造器注入注入了很多依赖.下面是用RhinoMocks来设置它,而不是AutoMocking容器:

private MockRepository _mocks;
private broadcastListViewPresenter _presenter;
private IbroadcastListView _view;
private IAddNewbroadcastEventbroker _addNewbroadcastEventbroker;
private IbroadcastService _broadcastService;
private IChannelService _channelService;
private IDeviceService _deviceService;
private IDialogFactory _dialogFactory;
private IMessageBoxService _messageBoxService;
private ITouchScreenService _touchScreenService;
private IDevicebroadcastFactory _devicebroadcastFactory;
private IFilebroadcastFactory _filebroadcastFactory;
private IbroadcastServiceCallback _broadcastServiceCallback;
private IChannelServiceCallback _channelServiceCallback;

[SetUp]
public void SetUp()
{
    _mocks = new MockRepository();
    _view = _mocks.Dynamicmock<IbroadcastListView>();

    _addNewbroadcastEventbroker = _mocks.Dynamicmock<IAddNewbroadcastEventbroker>();

    _broadcastService = _mocks.Dynamicmock<IbroadcastService>();
    _channelService = _mocks.Dynamicmock<IChannelService>();
    _deviceService = _mocks.Dynamicmock<IDeviceService>();
    _dialogFactory = _mocks.Dynamicmock<IDialogFactory>();
    _messageBoxService = _mocks.Dynamicmock<IMessageBoxService>();
    _touchScreenService = _mocks.Dynamicmock<ITouchScreenService>();
    _devicebroadcastFactory = _mocks.Dynamicmock<IDevicebroadcastFactory>();
    _filebroadcastFactory = _mocks.Dynamicmock<IFilebroadcastFactory>();
    _broadcastServiceCallback = _mocks.Dynamicmock<IbroadcastServiceCallback>();
    _channelServiceCallback = _mocks.Dynamicmock<IChannelServiceCallback>();


    _presenter = new broadcastListViewPresenter(
        _addNewbroadcastEventbroker,_broadcastService,_channelService,_deviceService,_dialogFactory,_messageBoxService,_touchScreenService,_devicebroadcastFactory,_filebroadcastFactory,_broadcastServiceCallback,_channelServiceCallback);

    _presenter.View = _view;
}

现在,AutoMocking容器也是一样的:

private MockRepository _mocks;
private AutoMockingContainer _container;
private broadcastListViewPresenter _presenter;
private IbroadcastListView _view;

[SetUp]
public void SetUp()
{

    _mocks = new MockRepository();
    _container = new AutoMockingContainer(_mocks);
    _container.Initialize();

    _view = _mocks.Dynamicmock<IbroadcastListView>();
    _presenter = _container.Create<broadcastListViewPresenter>();
    _presenter.View = _view;

}

更容易吗

AutoMocking容器会自动为构造函数中的每个依赖项创建嘲讽,您可以访问它们进行测试,如下所示:

using (_mocks.Record())
    {
      _container.Get<IChannelService>().Expect(cs => cs.ChannelIsbroadcasting(channel)).Return(false);
      _container.Get<IbroadcastService>().Expect(bs => bs.Start(8));
    }

希望有帮助.我知道,随着AutoMocking容器的出现,我的测试生活已经变得非常简单了.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...