Что касается FlexCover - причина, по которой вы видите, что он иногда работает, а не другие, заключается в том, что CoverageAgent предназначен для выхода из модульных тестов, которые он не передает обратно CoverageViewer. Я создал свой собственный FlexCoverListener, который отправляет сообщение о выходе через локальное подключение к CoverageViewer. Ниже приведен код.
package org.flexunit.listeners
{
import flash.events.EventDispatcher;
import org.flexunit.listeners.closer.FlexCoverCloser;
import org.flexunit.runner.IDescription;
import org.flexunit.runner.Result;
import org.flexunit.runner.notification.Failure;
import org.flexunit.runner.notification.IAsyncStartupRunListener;
import org.flexunit.runner.notification.ITemporalRunListener;
public class FlexCoverListener extends EventDispatcher implements IAsyncStartupRunListener,
ITemporalRunListener
{
import com.allurent.coverage.runtime.CoverageManager;
public function FlexCoverListener()
{
}
public function get ready():Boolean
{
return true;
}
public function testTimed( description:IDescription, runTime:Number ):void
{
}
public function testRunFinished( result:Result ):void
{
CoverageManager.agent.recordCoverage("SR_TESTS_COMPLETE");
}
public function testFinished( description:IDescription ):void {}
public function testRunStarted( description:IDescription ):void {}
public function testStarted( description:IDescription ):void{}
public function testFailure( failure:Failure ):void{}
public function testAssumptionFailure( failure:Failure ):void{}
public function testIgnored( description:IDescription ):void{}
}
}
Вы можете добавить вышеупомянутого слушателя в свои тесты, выполнив в TestRunner следующее:
core.addListener(new FlexCoverListener());
var core : FlexUnitCore = new FlexUnitCore();
Последнее, но самое важное: я изменил метод recordCoverage
в AbstractCoverageAgent
, чтобы он выглядел следующим образом:
/**
* Record the execution of a single coverage key; called by
* the global coverage() function.
*/
public function recordCoverage(key:String):void
{
if(key == "SR_TESTS_COMPLETE")
{
exit();
}
else if (isNaN(coverageMap[key]++))
{
// The map must not have contained this key yet, so enter an
// execution count of 1. Subsequent calls will autoincrement without
// returning NaN.
//
coverageMap[key] = 1;
}
}