2012-02-22 103 views
1

发送对象可以说我有一个事件处理程序,如下所示:单元测试在事件处理

public SomethingHappended_Handler(object sender, EventArgs e) 
{ 
    var myobj = sender as MyClass(); 
    myobj.DoSomethingImportant(); 
} 

我如何可以测试MyObj中是MyClass的类型?我知道,发件人将永远是MyClass的,但我只是想为了安全起见,我需要一个:

if (myObj != null) //Close it 

如果类型不是MyClass的那么MyObj中将为空。因为我知道最好测试非空值如何创建一个单元测试来证明如果我发送除MyClass之外的其他类型的发件人,它将会覆盖调用DoSomethingImportant,因此我需要空值检查?

+1

什么是错误的标准类型检查是否(myobj == null)... – Lloyd 2012-02-22 12:54:53

+0

@Lloyd你仍然需要投送发送者能够调用它的方法 – Jon 2012-02-22 12:57:41

+1

你基本上要求测试看看是否'as'做它应该做的事 - 恕我直言,你不应该需要在C#工作的方式下进行“单元测试”。 'as'只会在你想要投射的对象属于该类或该类的子类型时才会投射。但是,如果您真的想要编写另一个使用'as'安全转换的代码块,或者直接使用'is'关键字测试类型。或者,事件处理程序只是一个类中的一个方法,为它编写一个测试,就像任何一个类一样。 – 2012-02-22 13:09:14

回答

4

我可以用伪代码来回答你,指出你可以做什么。

首先您可以检查发件人是否为MyClass类型。

if(sender is MyClass) 

然后在你的单元测试,你可以在两个模拟对象,MyClass类型之一,另一种类型的“MyClassFake”的一个发送。使一个接口都使用并使它们实现Close()方法。

取2个单元测试:

  1. 验证MyClass.Close()被调用。
  2. 验证MyClassFake.Close()永远不会被调用。

Close()只是一个例子,如果你有其他方法,你可以测试一下调用/不对它们进行调用。