单元测试Windows窗体应用程序的建议

Duk*_*ade 25 c# unit-testing winforms

我已经编写了一个Windows窗体应用程序,现在我想为它编写一些单元测试(不完全是测试驱动的开发,因为我在开发后编写测试但是迟到的时候从未好过!)我的问题是这样的应用程序考虑到几乎所有的方法和事件都是私有的,你如何编写单元测试呢?我听说过NUnit Forms,但是我听到了它的优点和缺点,而且该项目暂时没有真正的发展,所以它看起来已经废弃了.此外,如果我为用户通过点击/按下按钮触发的所有事件编写单元测试用例,或者我必须为所有人编写单元测试用例,那么该项目已经进行了足够的单元测试方法并找出一种方法来测试我的私有方法?

编辑:我的业务逻辑与我的表示逻辑分离,我的业务逻辑公开了1或2个公共方法,因此表单可以访问它们,但是业务逻辑中的所有私有方法呢?

Wou*_*ort 30

单元测试图形应用程序的关键是确保所有业务逻辑都在一个单独的类中,而不是在后面的代码中.

设计此类系统时,模型视图展示器模型视图控制器等设计模式可以提供帮助.

举个例子:

public partial class Form1 : Form, IMyView
{
    MyPresenter Presenter;
    public Form1()
    {
        InitializeComponent();
        Presenter = new MyPresenter(this);
    }

    public string SomeData
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            MyTextBox.Text = value;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Presenter.ChangeData();
    }
}

public interface IMyView
{
    string SomeData { get; set; }
}

public class MyPresenter
{
    private IMyView View { get; set; }
    public MyPresenter(IMyView view)
    {
        View = view;
        View.SomeData = "test string";
    }

    public void ChangeData()
    {
        View.SomeData = "Some changed data";
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Form只有一些基础设施代码可以将您的所有内容组合在一起.您的所有逻辑都在Presenter类中,它只知道View Interface.

如果你想对它进行单元测试,你可以使用像Rhino Mocks这样的模拟工具来模拟View界面并将其传递给你的演示者.

[TestMethod]
public void TestChangeData()
{
    IMyView view = MockRepository.DynamickMock<IMyView>();
    view.Stub(v => v.SomeData).PropertyBehavior();

    MyPresenter presenter = new MyPresenter(view);

    presenter.ChangeData();

    Assert.AreEqual("Some changed data", view.SomeData);
}
Run Code Online (Sandbox Code Playgroud)


zie*_*mer 19

我要做的第一件事是确保您的业务逻辑与表单正确分离.基本上,使用MVC模式.然后,您可以轻松地测试表单外的所有内容,就好像表单甚至不存在一样.

现在,这仍然可能会留下一些未经测试的特定于表单的功能.IE,是否正确连接到服务的表单?为此,您仍然可以考虑NUnit Forms或其他替代方案.


jga*_*fin 5

将所有业务逻辑分解到一个单独的项目中,并对此进行单元测试。或者至少将所有逻辑从表单移到单独的类中。


Dan*_*ann 5

你有几个选择.

  1. 使用Coded UI等工具通过用户界面进行测试.这不是一个很好的选择,因为它比单元测试慢,而且测试往往更脆弱.

  2. 将业务逻辑与表示逻辑分开.如果您的UI中有许多私有方法执行业务逻辑,那么您的业务逻辑与您的演示文稿紧密相关.开始识别这些并将它们移出到可以测试的公共接口的单独类.阅读SOLID原则,它可以帮助您保持代码松散耦合和可测试.