验证执行的事件处理程序代码

时间:2012-02-20 13:36:46

标签: c# .net unit-testing .net-4.0 tdd

我的代码与此非常相似,但无法确定我是如何测试是否发生了事件处理程序。

public class MyClass : MyAbstractClass
{ 
  IFileSystem FileSystem;

  public MyClass(IFileSystem myFileSys)
  {
    FileSystem = myFileSys;
    FileSystem.EventHit += new EventHandler(FileSystem_EventHit);
  }

  public void FileSystem_EventHit(object sender, EventArgs e)
  {
    //Testing base.OnOutput is not possible which I wont go into
    base.OnOutput("EventHit");
  }
}

测试代码在这里:

    [Test]
    public void DoSomething_WhenCalled_EventFired()
    {
         var mock = new Moq.Mock<IFileSystem>();

         MyClass plugin = new MyClass (mock.Object);

         mock.Object.DoSomething();

         mock.Raise(x => x.EventHit += null, new EventArgs());

        //Verify/Assert that MyClass handled and did something in the event handler

    }

5 个答案:

答案 0 :(得分:1)

我能想到的最简单的方法就是在测试方法中添加自己的处理程序,这应该足够了吗?

[Test]
    public void DoSomething_WhenCalled_EventFired()
    {
         var mock = new Moq.Mock<IFileSystem>();
         bool isHit = false;

         mock.EventHit += (s, e) =>
         {
            isHit = true;
         };

         MyClass plugin = new MyClass (mock.Object);

         mock.Object.DoSomething();

         mock.Raise(x => x.EventHit += null, new EventArgs());

         Assert.IsTrue(isHit);

    }

答案 1 :(得分:0)

您需要注入一个模拟由于事件处理程序调用而调用的任何内容并验证它。你的评论说你无法测试base base.OnOutput,但在我看来,这正是你需要做的。

答案 2 :(得分:0)

基本上测试方法被调用的事实不是有效的测试用例,你应该测试方法背后的逻辑/行为。显然,对于给定的事件处理程序,没有什么可以测试的,这就是为什么任务看起来并不重要。

尝试用几个词来表达你想要测试什么,哪个测试用例。例如

  

MyClass将状态切换为State==Hit   FileSystem.EventHit事件。

答案 3 :(得分:0)

要做到这一点,你可能需要在MyClass中有一个标志,表明发生了事件。我知道,这只是为了进行测试,但有时候这样做很好。

答案 4 :(得分:0)

在事件处理程序中验证某些内容意味着尝试测试遗留代码时,我选择的选项是测试事件是从具体类型中触发而不是模拟。

[Test]
public void DoSomething_WhenCalled_EventFired()
{

  FileSystem fs = new FileSystem(mock.Object, timerMock.Object);

  bool WasItHit = false;
  fs.EventHit += delegate { WasItHit = true; };

  fs.DoSomething(); //This should call the event

  Assert.IsTrue(WasItHit);
}