使用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代码?
答案 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);
}
由于此代码有效,我想问题是你在另一个线程中录制(对于不同的存根)时在一个线程中进行播放。同时回放和录制似乎不是线程安全的,即使你在不同的存根上操作。