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

前端之家收集整理的这篇文章主要介绍了TDD和DI:依赖注射变得麻烦前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
C#,nUnit和Rhino Mocks,如果证明是适用的.

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

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

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

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

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

  1. private MockRepository _mocks;
  2. private BroadcastListViewPresenter _presenter;
  3. private IBroadcastListView _view;
  4. private IAddNewBroadcastEventBroker _addNewBroadcastEventBroker;
  5. private IBroadcastService _broadcastService;
  6. private IChannelService _channelService;
  7. private IDeviceService _deviceService;
  8. private IDialogFactory _dialogFactory;
  9. private IMessageBoxService _messageBoxService;
  10. private ITouchScreenService _touchScreenService;
  11. private IDeviceBroadcastFactory _deviceBroadcastFactory;
  12. private IFileBroadcastFactory _fileBroadcastFactory;
  13. private IBroadcastServiceCallback _broadcastServiceCallback;
  14. private IChannelServiceCallback _channelServiceCallback;
  15.  
  16. [SetUp]
  17. public void SetUp()
  18. {
  19. _mocks = new MockRepository();
  20. _view = _mocks.DynamicMock<IBroadcastListView>();
  21.  
  22. _addNewBroadcastEventBroker = _mocks.DynamicMock<IAddNewBroadcastEventBroker>();
  23.  
  24. _broadcastService = _mocks.DynamicMock<IBroadcastService>();
  25. _channelService = _mocks.DynamicMock<IChannelService>();
  26. _deviceService = _mocks.DynamicMock<IDeviceService>();
  27. _dialogFactory = _mocks.DynamicMock<IDialogFactory>();
  28. _messageBoxService = _mocks.DynamicMock<IMessageBoxService>();
  29. _touchScreenService = _mocks.DynamicMock<ITouchScreenService>();
  30. _deviceBroadcastFactory = _mocks.DynamicMock<IDeviceBroadcastFactory>();
  31. _fileBroadcastFactory = _mocks.DynamicMock<IFileBroadcastFactory>();
  32. _broadcastServiceCallback = _mocks.DynamicMock<IBroadcastServiceCallback>();
  33. _channelServiceCallback = _mocks.DynamicMock<IChannelServiceCallback>();
  34.  
  35.  
  36. _presenter = new BroadcastListViewPresenter(
  37. _addNewBroadcastEventBroker,_broadcastService,_channelService,_deviceService,_dialogFactory,_messageBoxService,_touchScreenService,_deviceBroadcastFactory,_fileBroadcastFactory,_broadcastServiceCallback,_channelServiceCallback);
  38.  
  39. _presenter.View = _view;
  40. }

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

  1. private MockRepository _mocks;
  2. private AutoMockingContainer _container;
  3. private BroadcastListViewPresenter _presenter;
  4. private IBroadcastListView _view;
  5.  
  6. [SetUp]
  7. public void SetUp()
  8. {
  9.  
  10. _mocks = new MockRepository();
  11. _container = new AutoMockingContainer(_mocks);
  12. _container.Initialize();
  13.  
  14. _view = _mocks.DynamicMock<IBroadcastListView>();
  15. _presenter = _container.Create<BroadcastListViewPresenter>();
  16. _presenter.View = _view;
  17.  
  18. }

更容易吗

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

  1. using (_mocks.Record())
  2. {
  3. _container.Get<IChannelService>().Expect(cs => cs.ChannelIsBroadcasting(channel)).Return(false);
  4. _container.Get<IBroadcastService>().Expect(bs => bs.Start(8));
  5. }

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

猜你在找的设计模式相关文章