gpt4 book ai didi

c# - 这是一个糟糕的设计吗?

转载 作者:太空狗 更新时间:2023-10-29 23:04:43 24 4
gpt4 key购买 nike

我正在尝试行为驱动开发,但我发现自己在编写设计时会再次猜测我的设计。这是我的第一个新建项目,可能只是我缺乏经验。无论如何,这是我正在编写的类(class)的简单规范。它是用 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 使用的接口(interface)都没有任何实际实现。 AccountService 将负责创建新帐户。可以将 IAccount 的多个实现定义为单独的插件。在运行时,如果存在多个帐户,则会提示用户选择要创建的帐户类型。否则,AccountService 只会创建一个帐户。

让我感到不安的一件事是,仅仅编写一个规范/测试就需要多少模拟。这只是使用 BDD 的副作用还是我以错误的方式处理这件事?

[更新]

这是 MainPresenter.AddAccount 的当前实现

    public void AddAccount()
{
IAccount account;
if (AccountService.AccountTypes.Count == 1)
{
account = AccountService.Create();
}
_view.Accounts.Add(account);
}

欢迎任何提示、建议或替代方案。

最佳答案

在进行自上而下的开发时,发现自己使用大量模拟是很常见的。您需要的部分不存在,因此您自然需要模拟它们。话虽如此,这确实感觉像是一个验收水平测试。根据我的经验,BDD 或上下文/规范在单元测试级别开始变得有点奇怪。在单元测试级别,我可能会按照...做更多的事情

when_adding_an_account   should_use_account_service_to_create_new_account   should_update_screen_with_new_account_details

您可能需要重新考虑您对 IAccount 接口(interface)的使用。我个人坚持保持领域实体服务的接口(interface)。但这更多是个人喜好。

其他一些小建议...

  • 您可能需要考虑使用 Mocking 框架,例如 Rhino Mocks(或 Moq),这样您就可以避免在断言中使用字符串。
  _mockAccountService.Expect(mock => mock.Create())     .Return(_account);
  • 如果您采用 BDD 风格,我见过的一种常见模式是使用链式类进行测试设置。在你的例子中......
public class MainPresenterSpec {    // Protected variables for Mocks     [SetUp]    public void Setup()    {       // Setup Mocks    }}[TestFixture]public class WhenUserAddsAccount : MainPresenterSpec{    [Test]    public void ShouldCreateNewAccount()    {    }}
  • 另外,我建议更改您的代码以使用保护子句..
     public void AddAccount()     {        if (AccountService.AccountTypes.Count != 1)        {            // Do whatever you want here.  throw a message?        return;        }    IAccount account = AccountService.Create();        _view.Accounts.Add(account);     }

关于c# - 这是一个糟糕的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/976435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com