务实的单元测试

时间:2010-02-05 13:22:55

标签: unit-testing design-patterns parsley

我正在使用MVC框架编写应用程序,该框架负责处理我们系统的许多样板连接。具体来说 - 应用程序是使用Parsley MVC框架用Flex编写的。但是,问题不是语言特定的。

在我的演示模型/代码隐藏/视图控制器中(无论你想要什么),我可能会有这样的事情:

[Event(name="attemptLogin",type="com.foo.AttemptLoginEvent")]
[ManagedEvents["attemptLogin"]
public class LoginViewPM {
   public function attemptLogin(username:String,password:String):void
   {
       dispatchEvent(new AttemptLoginEvent(username,password));
   }
 }

然后,在我的系统的其他地方,响应这个的代码看起来像这样

public class LoginCommand {
   [MessageHandler]
   public function execute(attemptLoginEvent:AttemptLoginEvent):void {
      // Do login related stuff
   }
}

重要的是要注意,在Flex / Actionscript中,编译器不会检查元标记。例如:

[Event(name="attemptLogin",type="com.foo.AttemptLoginEvent")]
[ManagedEvent["attemptLogin"] // Spelling mistake - metatag is ManagedEvents
public class LoginViewPM {

[Event(name="attemptLogin",type="com.foo.AttemptLoginEvent")]
[ManagedEvent["attemtLogin"] // Spelling mistake - event name is wrong
public class LoginViewPM {

在上面的两个例子中,框架将失败。在第一个示例中,它以静默方式失败(因为元标记不正确 - 因此框架永远不会参与)。在第二个示例中,我们获得了一些运行时日志记录,可以部分提醒我们事情是错误的。

鉴于此,关于MVC框架的职责,PM上的attemptLogin()方法的单元测试的实用级别是什么?即:

我应该:

  • 测试AttemptLoginEvent是否由MVC框架管理
  • 测试在调度事件时框架是否调用LoginCommand。

在其他容器/框架环境中,我倾向于不编写执行框架职责的测试,因为(恕我直言)这导致了脆弱的测试。但是,由于缺乏编译器检查,在这种情况下它可能看起来很糟糕。

思想?

2 个答案:

答案 0 :(得分:0)

如果你考虑一下,你并没有真正测试框架的责任,就像你正在测试你的程序员打字的程度一样。

但是,如果编写该事件的同一个编码人员也编写了测试,并且如果事件名称不会经常更新,那么您可能会跳过它,因为任何拼写错误都很可能在测试时被捕获正在撰写。

答案 1 :(得分:0)

您想要测试的内容如集成测试。如果您想进行单元测试,则必须定义单位是什么。

如果你想测试你的事件,请模拟事件接收器并找出之后是否已经调用了模拟。

public class MockLoginCommand : ICommandReceiver {

   public bool BeenCalled { get; set; }

   [MessageHandler]
   public function execute(attemptLoginEvent:AttemptLoginEvent):void {
      BeenCalled=true;
   }
}