C# 如何对BackgroundWorker C进行单元测试#
我尝试使用VS单元测试工具进行单元测试,方法如下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);
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并实现一个接口,然后将其伪造出来