如何单元测试BackgroundWorker C#

She*_*ock 4 c# unit-testing backgroundworker

我正在尝试进行单元测试,使用VS单元测试设备跟随方法.

void Get(string name, Action<string> callBack);
Run Code Online (Sandbox Code Playgroud)

这是单元测试仪

    [TestMethod]
    public void Test()
    {
        Action<string> cb = name =>
        {
            Assert.IsNotNull(name);
        };

        var d = new MyClass();
        d.Get("test", cb);
    }
Run Code Online (Sandbox Code Playgroud)

唯一的问题是内部实现使用BackgroundWorker,因此在另一个线程上调用回调.这是内部实施.

    public void Get(string name, Action<string> callBack)
    {
        callBackString = callBack;
        GetData(name);
    }  

    private void GetData(string name)
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerCompleted += bw_RunWorkerCompleted;
        bw.RunWorkerAsync(name);
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //do work here
        if (null != callBackString)
            callBackString("ok");
    }
Run Code Online (Sandbox Code Playgroud)

当然因为Get()立即返回,测试完成并且测试停止,因此RunWorkerCompleted永远不会被执行.我可以通过普通应用程序(WPF)轻松测试它,因为它仍在运行,但我希望能够对此进行单元测试.

有任何想法吗?提前致谢.

Mar*_*ris 7

就像是:

[TestMethod]
public void Test()
{   
    bool running = true;
    string result = null;

    Action<string> cb = name =>
    {
        result = name;
        running = false;
    };

    var d = new MyClass();
    d.Get("test", cb);

    while(running)
    {
        Thread.Sleep(100);
    }

    Assert.IsNotNull(result);
}
Run Code Online (Sandbox Code Playgroud)

虽然您可能希望在其中添加一些内容以阻止测试在其失败时永远运行...