플렉스, 플렉스유닛:이벤트가 두 번 전달되는지 테스트하는 방법은 무엇입니까?
-
19-09-2019 - |
문제
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 모형을 검색하면 훨씬 더 많은 결과를 얻을 수 있습니다.
확실히 다른 사고 방식이지만 일단 그것에 들어가면 그것들 없이 단위 테스트를 어떻게 진행했는지 궁금해하는 경향이 있습니다.