Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对BackgroundWorker C进行单元测试#_C#_Unit Testing_Backgroundworker - Fatal编程技术网

C# 如何对BackgroundWorker C进行单元测试#

C# 如何对BackgroundWorker C进行单元测试#,c#,unit-testing,backgroundworker,C#,Unit Testing,Backgroundworker,我尝试使用VS单元测试工具进行单元测试,方法如下 void Get(string name, Action<string> callBack); void Get(字符串名称,动作回调); 这是单元测试仪 [TestMethod] public void Test() { Action<string> cb = name => { Assert.IsNotNull(name);

我尝试使用VS单元测试工具进行单元测试,方法如下

void Get(string name, Action<string> callBack);
void Get(字符串名称,动作回调);
这是单元测试仪

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

        var d = new MyClass();
        d.Get("test", cb);
    }
[TestMethod]
公开无效测试()
{
动作cb=name=>
{
Assert.IsNotNull(名称);
};
var d=新的MyClass();
d、 获取(“测试”,cb);
}
唯一的问题是内部实现使用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");
    }
public void Get(字符串名称,操作回调)
{
callBackString=回调;
GetData(名称);
}  
私有void GetData(字符串名称)
{
BackgroundWorker bw=新的BackgroundWorker();
bw.DoWork+=bw_DoWork;
bw.RunWorkerCompleted+=bw_RunWorkerCompleted;
bw.RunWorkerAsync(名称);
}
私有void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
//你在这里工作吗
if(null!=callBackString)
回拨(“ok”);
}
当然,因为Get()会立即返回,所以测试会成功完成并停止测试,因此永远不会执行RunWorkerCompleted。我可以通过普通应用程序(WPF)轻松测试它,因为它保持运行,但我希望能够对其进行单元测试

有什么想法吗? 提前谢谢。

类似于:

[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);
}
[TestMethod]
公开无效测试()
{   
bool running=true;
字符串结果=null;
动作cb=name=>
{
结果=名称;
运行=错误;
};
var d=新的MyClass();
d、 获取(“测试”,cb);
(跑步时)
{
睡眠(100);
}
Assert.IsNotNull(结果);
}

虽然您可能想在其中添加一些东西,以便在测试失败时永远停止测试运行…

我不知道C#&BackgroundWorker的详细信息,但我会通过注入BackgroundWorker实现来实现这一点,并在测试期间使用一个存根BackgroundWorker,您可以控制它何时执行以及在哪个线程中执行。如果需要在两个线程之间进行通信,则让存根的BackgroundWorker创建一个新线程,并让测试暂停直到完成,如果不强制它在调用get之后运行。

我编写了类似的代码,并通过以下步骤使其可测试。我的单元测试针对该方法的同步(阻塞)版本运行。异步方法可以是单行,所以我没有针对这些方法编写单元测试。

好吧,我可以以同步(阻塞)的方式实现另一个版本的Get(),然后让客户端处理IAsyncResult设计模式,但这正是我首先要避免的。客户端不需要知道实现细节。它只是提供了一个回调,稍后将调用该回调。当BackgroundWorker未实现任何接口时,您如何做到这一点?您可以创建自己的类来包装BackgroundWorker并实现一个接口,然后将其伪造出来