Moq'ing多次举办活动

时间:2009-12-01 14:11:57

标签: c# unit-testing moq

在一个特定的单元测试中,我试图多次引发一个事件,然后在最终事件被引发之后通知一个属性值。我有类似

的东西
public void TurnRight()
{
   var mockFoo = new Mock<IFoo>();

   SomeService someService= new SomeService ();
   someService.Foo= mockFoo.Object;

   mockFoo.Raise(foo=> foo.TurnedRight += null, EventArgs.Empty);
   mockFoo.Raise(foo=> foo.TurnedRight += null, EventArgs.Empty);
   mockFoo.Raise(foo=> foo.TurnedRight += null, EventArgs.Empty);

   mockFoo.VerifySet(foo=> foo.Orientation = Orientation.West);
}

方向实际上只改为东方(因为我相信这个事件只会被提升一次)。难道我做错了什么?这是我第一次使用moq,所以我可能会遗漏一些东西。

干杯 Ĵ

编辑...我应该使用的正确代码

public void TurnRight()
    {
       var mockFoo = new Mock<IFoo>();

       SomeService someService= new SomeService ();
       someService.Foo= mockFoo.Object;

       mockFoo.SetupProperty(foo=> foo.Orientation);

       mockFoo.Raise(foo=> foo.TurnedRight += null, EventArgs.Empty);
       mockFoo.Raise(foo=> foo.TurnedRight += null, EventArgs.Empty);
       mockFoo.Raise(foo=> foo.TurnedRight += null, EventArgs.Empty);

       Assert.AreEqual(mockFoo.Object.Orientation, Orientation.South);
    }

1 个答案:

答案 0 :(得分:5)

mockFoo.Raise应该没问题,将事件提升三次......你能在事件处理程序中放一个断点并检查它被调用了多少次?

我可以看到另一个潜在的错误,就是你应该首先告诉Moq开始跟踪属性的所有设置/获取,然后才能验证它(以及在你提出事件之前):

// start "tracking" sets/gets to this property
mockFoo.SetupProperty(foo=> foo.Orientation);