为什么Rhino Mocks在使用线程时会抛出异常?

时间:2010-09-20 18:03:42

标签: c# multithreading rhino-mocks

使用Rhino Mocks和Threads时我们遇到了一个问题。我有 试图孤立这个问题,但现在我坚持这个:

[TestClass]
public class FoolTests
{
   [TestMethod]
   public void TestMethod_Scenario_Result()
   {
       for (int i = 0; i < 5; i++)
       {
           var fool = MockRepository.GenerateStub<IFool>();
           fool.Stub(x => x.AmIFool).Return(false);
           new Fool(fool);
       }
   }
}

public class Fool
{
   private readonly IFool _fool;
   private readonly Thread _thread;

   public Fool(IFool fool)
   {
       _fool = fool;
       _thread = new Thread(Foolish);
       _thread.Start();
   }

   private void Foolish()
   {
       while (true)
       {
           var foo = _fool.Foolness;
       }
   }
}

public interface IFool
{
   bool AmIFool { get; }
   bool Foolness { get; set; }
}

几乎所有运行此测试的时间,我得到“测试方法FoolTests.TestMethod_Scenario_Result引发异常:System.InvalidOperationException:当模拟对象处于重放状态时,此操作无效。”在线“fool.Stub(x =&gt; x.AmIFool)。返回(假);”。

我不知道这里应该出错什么。有没有人有想法或者我必须深入研究Rhino Mocks代码?

1 个答案:

答案 0 :(得分:3)

不确定这是否是一个完整的答案,但此页面有一个关于多线程的有趣说明:

http://www.ayende.com/projects/rhino-mocks/api/files/MockRepository-cs.html

  

MockRepository能够在多个线程中进行验证,但不建议在多个线程中进行记录。

我要尝试的第一件事就是设置所有的模拟和期望,然后执行你的构造函数。这似乎对我有用:

[TestMethod]
public void TestMethod_Scenario_Result()
{
    var stubs = new IFool[5];
    for (int i = 0; i < stubs.Length; ++i)
    {
        var fool = MockRepository.GenerateStub<IFool>();
        fool.Stub(x => x.AmIFool).Return(false);
        stubs[i] = fool;
    }

    foreach (var stub in stubs)
        new Fool(stub);
}

由于此代码有效,我想问题是你在另一个线程中录制(对于不同的存根)时在一个线程中进行播放。同时回放和录制似乎不是线程安全的,即使你在不同的存根上操作。