2010-05-07 2 views
3

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

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

ответ

4

Решенный ..............;)

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); 
    } 
+2

Обязательно добавьте «use namespace mx_internal;» на ваш макет службы. Кредит Тиму в ответе ниже. – mbseid

1

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

use namespace mx_internal;

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

[Fault] exception, information = TypeError: Error # 1006: setResult не является функцией.

1

Я использую какую-то 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; 
    } 

} 
} 
3

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

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 импорта.