1

可以说我有一个后台工作者在后台线程中执行数据库查询的类。用犀牛模拟测试一个后台工作者

我想测试这个类

,所以我嘲笑我的数据库,并返回一些收集到目前为止好, 确保我的背景工人称做工作 ,比我想请确保完成也发生了。

我注意到,测试通过和失败随机(我认为这是与线程)

任何建议

回答

1

你可能有后台线程之间的竞争条件和断言/验证。

例如:

[Test] 
public void TestWithRaceCondition() 
{ 
    bool called = false; 
    new Thread(() => called = true).Start(); 
    Assert.IsTrue(called); 
} 

线程不一定结束之前断言,有时它会,有时不会。解决的办法的情况是加入了后台线程:

[Test] 
public void TestWithoutRaceCondition() 
{ 
    bool called = false; 
    var thread = new Thread(() => called = true); 
    thread.Start(); 
    thread.Join() 
    Assert.IsTrue(called); 
} 

一种方法来检查它是否是一个竞争条件是延迟测试线程(调用了Thread.Sleep长时间只是断言之前),如果测试停止失败,这是比赛状况的良好指示。

+0

好主意.. 以及我如何得到这个线程的参考? 我正在测试封装这个东西的代码.. – 2009-11-23 19:27:17

+1

“配方”是为了可测试性而设计它,它需要一些工作。您可以使回调/线程/工作对测试可见(使用InternalsVisibleTo或使其成为虚拟并在继承类上测试它)。你可以看看一个例子:http://stackoverflow.com/questions/1770830/c-how-to-test-a-basic-threaded-worker-class/1770886#1770886。 其他我喜欢的选项是通过在Assert调用之前将测试线程休眠来添加一些“缓冲区”。 – Elisha 2009-11-23 21:06:22