如何在Windows窗体类中对测试方法进行单元测试?

时间:2019-07-12 06:04:02

标签: c# visual-studio unit-testing integration-testing

我正在开发一个c#Windows窗体应用程序,并且在主窗体类中有一个方法。

想象方法A作为主窗体类的一部分。

public void methodA() {
    A.someMethod();
    B.someMethod();

    // some more code

    if (someCondition) {
        // execute some code 
    }

    // initialize timer and set event handler for timer
    // run new thread 

    }

class A {
    someMethod() {...}
}

class B {
    someMethod() {...}
}

我将如何运行测试以测试此methodA(isCondition)的分支逻辑?因为它涉及初始化计时器和运行线程。我只能在进行系统测试时验证逻辑吗?我认为不可能模拟计时器和线程功能。

谢谢!

1 个答案:

答案 0 :(得分:2)

您当然可以嘲笑计时器。这是通过创建一个新的接口,例如ITimerWrapper并使用具体的Timer类来实现它。基本上是Timer类的包装。然后使用它代替您拥有的具体Timer类。

以下方面:

public partial class Form1 : Form
{
    private readonly ITimerWrapper _timerWrapper;
    public Form1(ITimerWrapper timerWrapper)
    {
        InitializeComponent();

        this._timerWrapper = timerWrapper; // of course this is done via dependency injection
        this._timerWrapper.Interval = 1000;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // now you can mock this interface

        this._timerWrapper.AddTickHandler(this.Tick_Event);
        this._timerWrapper.Start();
    }

    private void Tick_Event(object sender, EventArgs e)
    {
        Console.WriteLine("tick tock");
    }
}

public interface ITimerWrapper
{
    void AddTickHandler(EventHandler eventHandler);
    void Start();
    void Stop();
    int Interval { get; set; }
}
public class TimerWrapper : ITimerWrapper
{
    private readonly Timer _timer;

    public TimerWrapper()
    {
        this._timer = new Timer();
    }

    public int Interval
    {
        get
        {
            return this._timer.Interval;
        }
        set
        {
            this._timer.Interval = value;
        }
    }

    public void AddTickHandler(EventHandler eventHandler)
    {
        this._timer.Tick += eventHandler;
    }

    public void Start()
    {
        this._timer.Start();
    }

    public void Stop()
    {
        this._timer.Stop();
    }
}

然后旋转新线程,也可以通过执行相同的操作来测试。

底线是要有一个界面来分离问题并在单元测试中模拟该界面。