用犀牛嘲笑测试背景工作者

时间:2009-10-24 22:25:47

标签: c# unit-testing multithreading rhino-mocks backgroundworker

假设我在一个类中有一个后台工作程序,它在后台线程中执行数据库查询。

我想测试这门课程

所以我模拟我的数据库并返回一些目前为止这么好的集合, 确保我的后台工作人员称之为工作 而且我想确保结束也发生了。

我注意到测试通过并随机失败(我认为它与线程有关)

任何建议

1 个答案:

答案 0 :(得分: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)以及测试是否停止失败,这是竞争条件的良好指示。