Как подделать возврат AsyncToken в ActionScript 3 - PullRequest
3 голосов
/ 07 мая 2010

Используя петрушку, У меня есть сервис, к которому я получаю доступ через [Команда (селектор = 'список')] публичная функция getRssFeed (msg: RssEvent): AsyncToken { вернуть service.list () как AsyncToken; }

когда я указываю на «Реальный» RssService, все работает как положено. Моя проблема, когда я указываю на «Mock» RssService. Я не могу понять, как подделать AsyncToken с помощью фиктивного возврата данных ... Кто-нибудь знает, как это сделать?

Ответы [ 4 ]

4 голосов
/ 08 мая 2010

Решено ..............;)

 public function list():AsyncToken

     var rssFeed:Array = [rss,rss,rss];
     var token:AsyncToken = createToken(rssFeed);
     token.addResponder(new AsyncResponder(resultHandler, null));
     return token;

  }

  private function resultHandler(event:ResultEvent, token:AsyncToken = null):void
  {
     event.token.dispatchEvent(event);   
  }


  protected function createToken(result:Object):AsyncToken
  {
     var token:AsyncToken = new AsyncToken(null);
     setTimeout(applyResult, Math.random()*500, token, result);
     return token;
  }

  private function applyResult(token:AsyncToken, result:Object):void
  {
     mx_internal:token.setResult(result);
     var event:ResultEvent = new ResultEvent(ResultEvent.RESULT, false, true, result, token);
     mx_internal:token.applyResult(event);
     trace(token);
  }
3 голосов
/ 09 октября 2012

Используя Parsley 3.0, вы получаете лучший вариант с прямыми асинхронными командами:

public class MockCommand
{
    public var callback:Function;

    public function execute():void
    {
        var timer:Timer = new Timer(500, 1);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, timer_completeHandler);
        timer.start();
    }

    private function timer_completeHandler(event:TimerEvent):void
    {
        callback(mockResultData);
    }
}

Нет необходимости в импорте mx_internal.

1 голос
/ 14 сентября 2011

Я использую некоторый шаблон ServiceProxy, который предоставляет в основном 3 метода:

  • invokeOperation
  • mockResultInvokeOperation
  • mockFaultInvokeOperation

Я расширяю ServiceProxy следующим образом:

public class SomeService extends ServiceProxy {
    public var useMock:Boolean;

    public function someServiceCall(arg1:Type, arg2:Type, responder:IResponder):AsyncToken {
        if (useMock) {
            mockResultInvokeOperation({some fake result object}, responder);
        }

        return invokeOperation("someServiceCall", [arg1, arg2], responder);
    }

}

В технологическом плане я использую точно такой же трюк, что и вы.

package com.obecto.services.proxy
{
import flash.utils.setTimeout;

import mx.core.mx_internal;
import mx.messaging.messages.RemotingMessage;
import mx.rpc.AbstractOperation;
import mx.rpc.AbstractService;
import mx.rpc.AsyncToken;
import mx.rpc.Fault;
import mx.rpc.IResponder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;

public class ServiceProxy
{
    public var service:AbstractService;

    public function invokeOperation(operationName:String, arguments:Array, responder:IResponder):AsyncToken 
    {
        var operation:AbstractOperation = service.getOperation(operationName);
        operation.arguments = arguments;

        var token:AsyncToken = operation.send();
        token.addResponder(responder);
        return token;
    }

    public function mockResultInvokeOperation(mockResult:Object, responder:IResponder):AsyncToken
    {
        var fakeMessage:RemotingMessage = new RemotingMessage();

        var token:AsyncToken = new AsyncToken(fakeMessage);
        token.addResponder(responder);

        setTimeout(
            function(e:ResultEvent = null):void 
            {
                token.mx_internal::applyResult(new ResultEvent(ResultEvent.RESULT, false, true, mockResult));
            }, 1000);

        return token;
    }

    public function mockFaultInvokeOperation(message:String, responder:IResponder):AsyncToken
    {
        var fakeMessage:RemotingMessage = new RemotingMessage();

        var token:AsyncToken = new AsyncToken(fakeMessage);
        token.addResponder(responder);

        setTimeout(
            function(e:ResultEvent = null):void 
            {
                token.mx_internal::applyFault(new FaultEvent(FaultEvent.FAULT, false, true, 
                    new Fault("MOCK_FAULT", message)));
            }, 1000);

        return token;
    }

}
}
1 голос
/ 21 декабря 2010

Не забудьте добавить:

use namespace mx_internal;

В противном случае вы получите это исключение.

Исключение [Fault], информация = Ошибка типа: Ошибка # 1006: setResult не является функцией.

...