我在模拟对象上引发事件时遇到问题。我正在使用Rhino Mocks 3.4。我研究过类似的问题,但未能重现任何建议的解决方案。
我有一个类--Foo - 它有一个私有方法,只能通过注入接口的事件调用来访问 - IBar。
如何从RhinoMock对象中引发事件IBar.BarEvent,以便我可以在Foo中测试方法?
这是我的代码:
[TestFixture]
public sealed class TestEventRaisingFromRhinoMocks
{
[Test]
public void Test()
{
MockRepository mockRepository = new MockRepository();
IBar bar = mockRepository.Stub<IBar>();
mockRepository.ReplayAll();
Foo foo = new Foo(bar);
//What to do, if I want invoke bar.BarEvent with value =123??
Assert.That(foo.BarValue, Is.EqualTo(123));
}
}
public class Foo
{
private readonly IBar _bar;
private int _barValue;
public Foo(IBar bar)
{
_bar = bar;
_bar.BarEvent += BarHandling;
}
public int BarValue
{
get { return _barValue; }
}
private void BarHandling(object sender, BarEventArgs args)
{
//Eventhandling here: How do I get here with a Rhino Mock object?
_barValue = args.BarValue;
}
}
public interface IBar
{
event EventHandler<BarEventArgs> BarEvent;
}
public class BarEventArgs:EventArgs
{
public BarEventArgs(int barValue)
{
BarValue = barValue;
}
public int BarValue { get; set; }
}
答案 0 :(得分:4)
我想是这样的事情:
bar.Raise(x => x.BarEvent += null, this, EventArgs.Empty);
http://ayende.com/wiki/Rhino+Mocks+3.5.ashx#Howtoraiseevents
答案 1 :(得分:2)
您需要IEventRaiser
,您可以通过
bar.BarEvent += null;
var eventRaiser = LastCall.IgnoreArguments().GetEventRaiser();
然后,当您想要举起活动时,您可以使用所需的参数调用eventRaiser.Raise
,例如sender和event args(取决于你的事件处理程序定义)。
(编辑:这是基于Rhino.Mocks 3.1!)