Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 用rhino Mock测试后台工作人员_C#_Unit Testing_Multithreading_Rhino Mocks_Backgroundworker - Fatal编程技术网

C# 用rhino Mock测试后台工作人员

C# 用rhino Mock测试后台工作人员,c#,unit-testing,multithreading,rhino-mocks,backgroundworker,C#,Unit Testing,Multithreading,Rhino Mocks,Backgroundworker,假设我在一个类中有一个后台工作程序,该类在后台线程中执行db查询 我想考这门课 所以我嘲笑我的db,并返回了一些到目前为止还不错的收藏, 确保我的后台工作人员调用DoWork 然后,我想确保也能完成比赛 我注意到测试随机通过和失败(我认为这与线程有关) 任何建议后台线程和断言/验证之间可能存在争用条件 例如: [Test] public void TestWithRaceCondition() { bool called = false; new Thread(() =>

假设我在一个类中有一个后台工作程序,该类在后台线程中执行db查询

我想考这门课

所以我嘲笑我的db,并返回了一些到目前为止还不错的收藏, 确保我的后台工作人员调用DoWork 然后,我想确保也能完成比赛

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


任何建议

后台线程和断言/验证之间可能存在争用条件

例如:

[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长时间),如果测试停止失败,这是竞争条件的良好指示。

后台线程和断言/验证之间可能存在竞争条件

例如:

[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长时间),如果测试停止失败,这是竞争条件的良好指示。

好主意。。我怎样才能得到这个线程的引用???我正在测试一个封装了这些东西的代码.“秘诀”是设计它的可测试性,它需要一些工作。您可以使回调/线程/工作者对测试可见(使用InternalsVisibleTo或通过使其虚拟并在继承的类上测试)。您可以查看一个示例:。我不太喜欢的另一种选择是,在Assert调用之前,通过将测试线程置于睡眠状态来添加一些“缓冲区”。。我怎样才能得到这个线程的引用???我正在测试一个封装了这些东西的代码.“秘诀”是设计它的可测试性,它需要一些工作。您可以使回调/线程/工作者对测试可见(使用InternalsVisibleTo或通过使其虚拟并在继承的类上测试)。您可以查看一个示例:。我不太喜欢的另一种选择是,通过在Assert调用之前将测试线程置于睡眠状态来添加一些“缓冲区”。