我正在尝试行为驱动的开发,我发现自己在编写设计时第二次猜测我的设计。这是我的第一个绿地项目,可能只是我缺乏经验。无论如何,这是我正在编写的类的简单规范。它以 BDD 风格用 NUnit 编写,而不是使用专用的行为驱动框架。这是因为该项目以 .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 的副作用还是我以错误的方式处理这件事?
[更新]
这是 MainPresenter.AddAccount 的当前实现
public void AddAccount()
{
IAccount account;
if (AccountService.AccountTypes.Count == 1)
{
account = AccountService.Create();
}
_view.Accounts.Add(account);
}
欢迎任何提示、建议或替代方案。