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容器的出现,我的测试生活已经变得非常简单了.