Я пробую свои силы в разработке, основанной на поведении, и нахожу себя вторым, угадывающим мой дизайн, когда я пишу его. Это мой первый проект с нуля, и это может быть просто отсутствие опыта. В любом случае, вот простая спецификация для класса (классов), который я пишу. Он написан на NUnit в стиле BDD вместо использования специализированной структуры, управляемой поведением. Это связано с тем, что проект нацелен на .NET 2.0 и все платформы BDD, кажется, охватили .NET 3.5.
[TestFixture]
public class WhenUserAddsAccount
{
private DynamicMock _mockMainView;
private IMainView _mainView;
private DynamicMock _mockAccountService;
private IAccountService _accountService;
private DynamicMock _mockAccount;
private IAccount _account;
[SetUp]
public void Setup()
{
_mockMainView = new DynamicMock(typeof(IMainView));
_mainView = (IMainView) _mockMainView.MockInstance;
_mockAccountService = new DynamicMock(typeof(IAccountService));
_accountService = (IAccountService) _mockAccountService.MockInstance;
_mockAccount = new DynamicMock(typeof(IAccount));
_account = (IAccount)_mockAccount.MockInstance;
}
[Test]
public void ShouldCreateNewAccount()
{
_mockAccountService.ExpectAndReturn("Create", _account);
MainPresenter mainPresenter = new MainPresenter(_mainView, _accountService);
mainPresenter.AddAccount();
_mockAccountService.Verify();
}
}
Ни один из интерфейсов, используемых MainPresenter, еще не имеет реальных реализаций. AccountService будет отвечать за создание новых учетных записей. Может быть несколько реализаций IAccount, определенных как отдельные плагины. Во время выполнения, если их несколько, пользователю будет предложено выбрать тип создаваемой учетной записи. В противном случае AccountService просто создаст учетную запись.
Одна из вещей, которая вызывает у меня беспокойство, - это то, сколько издевательств требуется только для написания одной спецификации / теста. Это просто побочный эффект от использования BDD или я поступаю неправильно?
[Update]
Вот текущая реализация MainPresenter.AddAccount
public void AddAccount()
{
IAccount account;
if (AccountService.AccountTypes.Count == 1)
{
account = AccountService.Create();
}
_view.Accounts.Add(account);
}
Любые советы, предложения или альтернативы приветствуются.