如何获得Unit组件?我可以使用addAsync获取解决方案吗?

时间:2014-07-03 10:17:46

标签: tdd

我想构建一个遇到问题的程序,我发现我的第一批涉及自定义组件的测试往往会遵循代码:

 import mx.core.Application;     
 import mx.events.FlexEvent;
 import flexunit.framework.TestCase;
public class CustomComponentTest extends TestCase { 
private var component:CustomComponent;
public function testSomeAspect() : void {
component = new CustomComponent();
component.addEventListener(FlexEvent.CREATION_COMPLETE, 
addAsync(verifySomeAspect, 5000));
component.height = 0;
component.width = 0;
Application.application.addChild(component);
}

 public function verifySomeAspect(event:FlexEvent) : void {}

override public function tearDown() : void {
 try {
if (component) {
Application.application.removeChild(component);
component = null;
}
} catch (e:Error) {
 }
 }

首先,您需要确保组件已完全初始化,然后才能可靠地验证它的任何内容,而在Flex中,这会在将其添加到显示列表后异步发生。所以你需要设置一个回调(使用FlexUnit的addAsync函数),以便在发生这种情况时得到通知。 最近我只是手动调用运行时在必要的地方为你调用的方法,所以现在我的测试看起来更像是这样:

import flexunit.framework.TestCase;
public class CustomComponentTest extends TestCase {
public function testSomeAspect() : void {
var component:CustomComponent = new CustomComponent();
 component.initialize();
 component.validateProperties();
 }

这更容易理解,但有点像我在某种程度上作弊。第一种情况是将其关闭到当前的应用程序(这将是单元测试运行程序shell应用程序),而后者不是“真实”环境。我想知道其他人将如何处理这种情况?

1 个答案:

答案 0 :(得分:3)

我同意第二个版本更短,但我不确定我认为它更容易理解。测试会做很多你通常不会做的事情,而第一个例子更像是在测试环境之外如何使用组件。

此外,在第二种形式中,您必须确保您完全按照框架执行的操作,错过一步并且您的测试不相关,并且每个测试都必须重复此代码。在我看来,在尽可能接近真实情况的情况下测试它会更好。

您可以查看dpUint的序列,它们使组件测试更具说明性:

 public function testLogin():void {
 var passThroughData:Object = new Object();
 passThroughData.username = "myuser1";
  passThroughData.password = "somepsswd";
  var sequence:SequenceRunner = new SequenceRunner(this);
    sequence.addStep(new SequenceSetter(form.usernameTI, 

   {text:passThroughData.username}));
    sequence.addStep(new SequenceWaiter(form.usernameTI,     

    FlexEvent.VALUE_COMMIT, 100));
  sequence.addStep(new SequenceSetter(form.passwordTI, 

   {text:passThroughData.password}));
    sequence.addStep(new SequenceWaiter(form.passwordTI, FlexEvent.VALUE_COMMIT, 100));
    sequence.addStep(new SequenceEventDispatcher(form.loginBtn,

    new MouseEvent("click", true, false)));
      sequence.addStep(new SequenceWaiter(form, "loginRequested", 100));
         sequence.addAssertHandler(handleLoginEvent, passThroughData);
      sequence.run();}