unit testing - unitaria - ¿Puedo pasar un conjunto a un caso de prueba en DUnitX?
pruebas unitarias java eclipse (2)
Agregue esta función de conversión a DUnitX.Utils
y DUnitX.Utils
en la matriz de Conversiones para tkUString
a tkSet
(debido a las limitaciones de StringToSet
y TValue
esto solo funciona para conjuntos de hasta 32 elementos, para conjuntos más grandes de hasta 256 elementos, se necesita más código). aunque):
function ConvStr2Set(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean;
begin
TValue.Make(StringToSet(ATarget, ASource.AsString), ATarget, AResult);
Result := True;
end;
También necesita usar un separador de caracteres diferente para los parámetros o los dividirá incorrectamente:
[TestCase(''Demo1'',''InputA;[resWarn,resError]'', '';'')]
Estoy tratando de verificar el estado de un objeto después de ejecutar una prueba. Este estado está contenido en un conjunto. ¿Es posible pasar el estado esperado al caso de prueba usando los atributos DUnitX, de modo que pueda usar la misma prueba para todas las diferentes entradas?
Traté de pasar el conjunto como una constante o como un conjunto, pero en mi rutina de prueba siempre llega como un conjunto vacío.
- ¿Es esto posible usando atributos?
- ¿Cómo probarías si los conjuntos son idénticos?
Código de ejemplo:
type
TResult = (resOK,resWarn,resError);
TResultSet = set of TResult;
const
cErrWarn : TResultSet = [resWarn];
type
[TestFixture]
TMyTest = class(TBaseTest)
[Test]
[TestCase(''Demo1'',''InputA,[resWarn]'')] // <-- tried as a set
[TestCase(''Demo2'',''InputB,cErrWarn'')] // <-- tried as a constant
procedure Test(Input:string; ExpectedResult: TResultSet);
end;
procedure TMyTest.Test(Input:string; ExpectedResult: TResultSet);
begin
// ExpectedResult is always the empty set []
RunTests(MyObject(Input));
Assert.AreEqual(ExpectedResult, MyObject.ResultSet);
end;
También traté de definir el resultado esperado como una matriz, pero luego DUnitX ya no convoca la prueba. Probablemente es solo "demasiado"
procedure Test(Input:string; ExpectedResult: array of TResult);
Lo mejor que pude llegar hasta ahora fue usar el siguiente enfoque. Tome una muestra de hasta tres (inserte su entero favorito aquí ...) los estados esperados y verifique estos por separado. Esto no es realmente lo que esperaba, pero funciona.
procedure Test(Input:string; R1,R2,R3: TResult);
La ayuda es muy apreciada. :)
Está utilizando TestCaseAttribute
para especificar los argumentos que se pasarán a su método de prueba. Sin embargo, simplemente no ofrece ningún soporte para pasar conjuntos como argumentos. Puede ver que esto es así al observar las Conversions
constantes declaradas en la unidad DUnitX.Utils
. ConvFail
cualquier conversión a un conjunto a ConvFail
.
Entonces, si desea especificar estos datos utilizando atributos, necesitará ampliar el marco de prueba. Puede derivar su propio descendiente de CustomTestCaseSourceAttribute
y anular GetCaseInfoArray
para descodificar los argumentos del conjunto. Como ejemplo crudo, podrías usar esto:
type
MyTestCaseAttribute = class(CustomTestCaseSourceAttribute)
private
FCaseInfo: TestCaseInfoArray;
protected
function GetCaseInfoArray: TestCaseInfoArray; override;
public
constructor Create(const ACaseName: string; const AInput: string; const AExpectedResult: TResultSet);
end;
constructor MyTestCaseAttribute.Create(const ACaseName, AInput: string; const AExpectedResult: TResultSet);
begin
inherited Create;
SetLength(FCaseInfo, 1);
FCaseInfo[0].Name := ACaseName;
SetLength(FCaseInfo[0].Values, 2);
FCaseInfo[0].Values[0] := TValue.From<string>(AInput);
FCaseInfo[0].Values[1] := TValue.From<TResultSet>(AExpectedResult);
end;
function MyTestCaseAttribute.GetCaseInfoArray: TestCaseInfoArray;
begin
Result := FCaseInfo;
end;
A continuación, puede agregar el siguiente atributo a su método de prueba:
[MyTestCase(''Demo2'', ''InputB'', [resWarn])]
procedure Test(Input: string; ExpectedResult: TResultSet);
He evitado usar RTTI aquí por simplicidad, pero usar RTTI le daría más flexibilidad. Pasa el argumento como una cadena y lo decodifica con RTTI, tal como lo hace el código en DUnitX. Esto significa que no necesita escribir atributos personalizados cada vez que quiera usar un argumento establecido.
Aún mejor sería implementar esto dentro de DUnitX extendiendo el mapa de Conversions
a conjuntos de portadas, y enviarlo como un parche. Estoy seguro de que otros lo encontrarían útil.