0

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

在我的 Presentation Model / Code-Behind / View-Controller (无论你想怎么称呼它)中,我可能有这样的东西:

[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 上的 tryLogin() 方法的实用级别的单元测试是什么?IE:

我是不是该:

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

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

想法?

4

2 回答 2

0

您要测试的内容听起来像是集成测试。如果你想要一个单元测试,你必须定义你的单元是什么。

如果您想测试您的事件,请模拟事件接收器并确定之后是否已调用模拟。

public class MockLoginCommand : ICommandReceiver {

   public bool BeenCalled { get; set; }

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

等等

于 2010-02-05T13:46:35.683 回答
0

如果你仔细想想,你并没有真正测试框架的职责,而是测试你的编码员的打字能力。

但是,如果编写事件的同一编码人员也编写了测试,并且如果事件名称不会经常更新,那么您可能会跳过它,因为在编写测试时很可能会发现任何拼写错误.

于 2010-02-05T13:32:42.547 回答