플렉스, 플렉스유닛:이벤트가 두 번 전달되는지 테스트하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1167549

문제

FlexUnit을 사용하여 Flex 앱에서 일부 이벤트 전달 코드를 테스트하고 있습니다. addAsync 이벤트가 전달되는지 테스트하는 방법입니다.지금까지는 적어도 하나의 이벤트가 발생했음을 확인할 수 있었습니다.하지만 좀 더 자세히 설명하고 싶습니다.내가 기대하는 일련의 이벤트가 정확히 전달되는지 확인하고 싶습니다.이를 수행하는 데 유용한 테스트 패턴(또는 다른 테스트 프레임워크 - 유연합니다!)이 있습니까?

이 코드를 시도했지만 두 번째로 호출되지 않는 것 같습니다.

protected function expectResultPropertyChange(event: Event, numberOfEvents: int = 1): void {
    trace("Got event " + event + " on " + event.target + " with " + numberOfEvents + " traces left...");
    assertTrue(event.type == ResponseChangedEvent.RESPONSE_CHANGED);
    if (numberOfEvents > 1) {
        event.target.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, numberOfEvents - 1));
    }
}

public function testSomething(): void {
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, 2));
    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);
}
도움이 되었습니까?

해결책

의견에 대한 응답으로 ...

이벤트가 직접 파견되면 어떻게됩니까? 응답 선택은 복합 객체에서 비동기 이벤트를 트리거하지 않으며 간단히 응답 _changed 이벤트 자체를 직접 발송했습니다. 나는 당신의 방법을 사용하여 어떻게이 접근법을 조롱 할 수 있는지 알지 못합니다. 나는 당신을 염두에두고 있습니다.

..이 경우 모의 또는 addasync를 사용할 필요가 없습니다. 이런 일은 다음과 같습니다.

public function testSomething(): void 
{
    var requiredQuestion : RequiredQuestion = new RequiredQuestion();

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);
}

다른 팁

이는 비동기 호출을 수행하는 무엇이든 모의 객체를 사용하여 유사한 문제를 어떻게 해결할 수 있는지에 대한 높은 수준의 예가 될 것입니다.분명히 나는 ​​귀하의 코드를 볼 수 없으므로 정확한 예를 제공할 수 없습니다.

따라서 제가 댓글에서 말했듯이 클래스의 종속성을 모의하여 비동기 호출을 가짜로 만들어 동기 호출이 되도록 할 수 있습니다.아래 수업을 들어보세요

public class RequiredQuestion extends EventDispatcher
{
    private var someAsynchronousObject : IAsynchronousObject;

    public function RequiredQuestion(someAsynchronousObject : IAsynchronousObject = null)
    {
        someAsynchronousObject = someAsynchronousObject || new AsynchronousObject();
        someAsynchronousObject.addEventListener(Event.COMPLETE, asyncCallComplete);
    }

    public function responseSelected(id : String, flag : Boolean) : void
    {
        //Will asynchronously fire the Event.COMPLETE event
        someAsynchronousObject.startAsynchrounsCall(); 
    }

    protected function asyncCallComplete(event : Event) : void
    {
        dispatchEvent(new ResponseChangedEvent(ResponseChangedEvent.RESPONSE_CHANGED));
    }
}

따라서 기본적으로 someAsynchronousObjec이 생성자를 통해 클래스에 주입되지 않는 한 사용하려는 구체적인 클래스를 사용하게 됩니다.AsycnhronousObject에는 자체 단위 테스트가 있거나 외부 클래스에 있으므로 실제로는 원하지 않거나 기능을 테스트할 필요가 없습니다.이제 할 수 있는 작업은 해당 동작을 위조하는 데 사용할 수 있는 IAsynchronousObject를 구현하는 모의 개체를 만드는 것입니다.ASMock 프레임워크를 사용하면 테스트는 다음과 같이 보일 수 있습니다:

public function testSomething(): void 
{
    var mockIAsycnhronousObject :  IAsynchronousObject =
        IAsynchronousObject(mockRepository.createStrict( IAsynchronousObject));

    SetupResult.forEventDispatcher(mockIAsycnhronousObject);
    SetupResult.forCall(mockIAsycnhronousObject.startAsynchronousCall())
        .dispatchEvent(new Event(Event.COMPLETE)); // all calls to the startAsynchronousCall method and dispatch the complete event everytime it's called.

    mockRepository.replayAll();

    var requiredQuestion : RequiredQuestion = new RequiredQuestion(mockIAsycnhronousObject);

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);

    mockRepository.verifyAll();
}

이는 모의가 단위 테스트에 어떻게 도움이 되는지 보여주는 한 예일 뿐입니다.ActionScript(12월에 출시됨)에는 아직 새로운 내용이지만 조롱에 대한 풍부한 정보가 있습니다.ASMock은 .net Rhino 모형을 기반으로 하므로 도움이 필요한 경우 Rhino 모형을 검색하면 훨씬 더 많은 결과를 얻을 수 있습니다.

확실히 다른 사고 방식이지만 일단 그것에 들어가면 그것들 없이 단위 테스트를 어떻게 진행했는지 궁금해하는 경향이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top