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";
    }
}
正如您所看到的,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);
}