C# 用rhino Mock测试后台工作人员
假设我在一个类中有一个后台工作程序,该类在后台线程中执行db查询 我想考这门课 所以我嘲笑我的db,并返回了一些到目前为止还不错的收藏, 确保我的后台工作人员调用DoWork 然后,我想确保也能完成比赛 我注意到测试随机通过和失败(我认为这与线程有关)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(() =>
任何建议后台线程和断言/验证之间可能存在争用条件 例如:
[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调用之前将测试线程置于睡眠状态来添加一些“缓冲区”。