代码之家  ›  专栏  ›  技术社区  ›  Mathias

单元测试在事件激发时对类执行void方法

  •  2
  • Mathias  · 技术社区  · 14 年前

    public class Talker
    {
       public event EventHandler Talking;
    
       public void Talk()
       {
          if (Talking != null)
          {
             Talking(this, null);
          }
       }
    }
    
    public class Listener
    {
       public void StartListening(Talker talker)
       {
          talker.Talking += HeardTalk;
       }
    
       public void HeardTalk(object sender, EventArgs e)
       {
          // do something private here
       }
    }
    

    如果没有反映方法已被调用的公共状态,那么您将如何进行单元测试,即一旦调用了startsistering,HeardTalk将被调用?为了验证,我可以添加这样一个状态,但它看起来很笨拙。理想情况下,我想断言调用是以类似于模拟框架的方式进行的,但是我不能模拟正在测试的类。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Thomas Weller    14 年前

    你可以用广告轻松地做这些事情 Typemock Isolator ,它允许您对“真实”对象有选择地“模拟”单个方法。

    [Test, Isolated]
    public void HeardTalk_GetsCalled()
    {
        // --- Arrange ---
        var talker = new Talker();
        var listener = new Listener();
        bool heardTalkWasCalled = false;
        Isolate.WhenCalled(() => listener.HeardTalk(null, null))                     // Selectively 'mock' the call to 'listener.HeardTalk()'
                                         .DoInstead(x => heardTalkWasCalled = true); // on the live object (arguments are ignored by default)
    
        // --- Act ---
        listener.StartListening(talker);
        talker.Talk();
    
        // --- Assert ---
        Assert.IsTrue(heardTalkWasCalled);
    }
    

    不可否认,Typemock隔离器带来了一些许可成本。但是,如果你认真测试,需要测试很多这样的东西,它的每一分钱都是值得的,因为它的力量和灵活性。

    笔记:


    托马斯

        2
  •  3
  •   Josh    14 年前

    至少应该有 一些 触发事件的可测量的副作用。可能您正在记录事件、将某些内容保存到数据存储区或更改类的内部状态。

    最后,如果您只想检查方法是否被调用,那么您实际上在测试什么?同样,必须有一个方法被调用的原因,这个原因必须有一些可以观察到的影响 在某个地方。。。