Источник:
http://www.jaestevan.com/test-unitar...studio-ax-2012
==============
Creo que todo el que lo haya intentado estará de acuerdo en que el framework para
Unit Testing integrado en el propio entorno de desarrollo de Microsoft Dynamics AX 2012 (
del nuevo Dynamics AX, AX 7, hablaremos otro día) es bastante limitado. Tan limitado que resulta prácticamente inutilizable en cuanto quieres
probar algo más o menos serio.
Pero hoy no quiero hablar de limitaciones sino de lo que
sí podemos hacer, y entre estas cosas está la posibilidad de utilizar classes proxy del código X++ para poder escribir las
pruebas unitarias en el propio
Visual Studio, y utilizar así sus posibilidades y su flexibilidad. Veamos un ejemplo sencillo.
Voy a intentar probar una clase que he hecho en X++ específicamente para esto, con este código:
///
/// Dummy fluid class for testing purposes
///
class DEVDummyTestCalcClass
{
real value;
}
public void new(real _value
)
{
value
= _value;
}
public real Value
()
{
return value;
}
public DEVDummyTestCalcClass Add
(real _value
)
{
return new DEVDummyTestCalcClass
(value
+ _value
);
}
public DEVDummyTestCalcClass Substract
(real _value
)
{
return new DEVDummyTestCalcClass
(value
- _value
);
}
public DEVDummyTestCalcClass Multiply
(real _value
)
{
return new DEVDummyTestCalcClass
(value
* _value
);
}
public DEVDummyTestCalcClass Divide
(real _value
)
{
return new DEVDummyTestCalcClass
(value
/ _value
);
}
En el
Visual Studio 2010 que todos tenemos en nuestros entornos de desarrollo de
Microsoft Dynamics AX 2012, creamos un nuevo proyecto de tipo
Test Project (yo he elegido C# pero supongo que también funcionarán en Visual Basic):
Añadimos este proyecto al
AOT. Esto es necesario para que se añada al proyecto la referencia al ensamblado que nos va a permitir el Interop entre X++ y CIL que necesitamos para que se generen las clases proxy:
Si no lo tenemos visible, mostramos el
Application Explorer para poder acceder a los objetos del AOT desde Visual Studio:
Elegimos la clase (o clases) que queremos probar, y las añadimos al proyecto, lo que efectivamente generará la clase
proxy automáticamente:
Ahora, en la clase de pruebas creada por defecto en el proyecto, o en otra clase cualquiera que hayamos creado, sustituimos el método
TestMethod1 por métodos de pruebas como estos (aplicables a la clase X++ que puse más arriba):
[TestMethod
]
public void TestConstruct
()
{
using (Session axSession
= new Session
())
{
axSession
.Logon(null,
null,
null,
null);
Assert
.AreEqual(0,
new DEVDummyTestCalcClass
(0).Value());
Assert
.AreEqual(-1,
new DEVDummyTestCalcClass
(-1).Value());
}
}
[TestMethod
]
public void TestSum
()
{
using (Session axSession
= new Session
())
{
axSession
.Logon(null,
null,
null,
null);
Assert
.AreEqual(10,
new DEVDummyTestCalcClass
(0).Add(10).Value());
Assert
.AreEqual(10,
new DEVDummyTestCalcClass
(0).Add(5).Add(5).Value());
}
}
[TestMethod
]
public void TestDivide
()
{
using (Session axSession
= new Session
())
{
axSession
.Logon(null,
null,
null,
null);
Assert
.AreEqual(10,
new DEVDummyTestCalcClass
(20).Divide(2).Value());
}
}
[TestMethod
]
[ExpectedException
(typeof(Microsoft
.Dynamics.AX.ManagedInterop.NumericException))]
public void TestDivideByZeroException
()
{
using (Session axSession
= new Session
())
{
axSession
.Logon(null,
null,
null,
null);
new DEVDummyTestCalcClass
(100).Divide(0).Value(); // Exception
}
}
A continuación ya podemos ejecutar estos
Test y verificar que nuestra clase funciona como se espera de ella:
Fácil, ¿Verdad? Si este tema interesa a más gente seguiré publicando artículos para escenarios más complicados. Digamos, más cerca de lo que serían unas pruebas de objetos reales. Mientras tanto, probablemente te interese mi
serie de artículos sobre gestión del ciclo de vida de aplicaciones AX 2012.
Источник:
http://www.jaestevan.com/test-unitar...studio-ax-2012