c# - Servicio de pruebas unitarias de la unidad y la inyección de dependencia
web-services unit-testing (2)
No puedo probar un servicio / actor confiable simplemente llamando a su constructor y luego probando sus métodos. var testService = new SomeService();
lanza una NullReferenceException. Entonces, ¿qué puedo hacer con el servicio desplegado ...
Entiendo que los Servicios / Actores Confiables de SF no son clases estándar de .NET, y la prueba unitaria de S / A implementado puede ser una idea extraña.
De todos modos ahora estoy intentando darle una oportunidad.
Por ejemplo. Acabo de implementar un Servicio, que en la prueba, he creado un objeto Proxy y he agregado un elemento a la cola de entrada del Servicio. Luego debo afirmar que el recuento de la cola de entrada = 1. Y funciona si acabo de implementar un Servicio y ningún otro Cliente / Servicios / Actores ha usado su cola de entrada. Pero la próxima vez que esta prueba falle, ese es el problema. Necesito hacer que el Servicio deje de operar con otros consumidores, deje caer su cola y luego lo pruebe. Para este propósito, puedo crear algunas propiedades de TestMode y algunos métodos como PropareoForTests / TestingCompleted y llamarlos desde el cliente de prueba antes y después de la prueba.
Es una mala idea hacerlo así. Tal vez hay algunas pautas para la prueba de unidad SF? Gracias.
ACTUALIZAR:
Mientras investigaba el ejemplo de la Aplicación de referencia web de Service Fabric , he encontrado esta cadena TODO:
/// TODO: Temporary property-injection for an IServiceProxyWrapper until constructor injection is available.
¿Significa que SF Services mejorará su soporte de DI? ¿Qué pasa con los actores?
¡De hecho, puede probar los Servicios y Actores Confiables de la misma forma que probaría cualquier otra clase en .NET! Solo son especiales porque usan ciertos enlaces en la plataforma subyacente, pero aparte de eso, puede instanciar su clase de actor o servicio normalmente y llamar a métodos.
Actualmente, los servicios confiables son un poco más fáciles de probar por unidad porque el gancho principal en la plataforma, el Administrador del estado, es una interfaz que se puede conectar a través del constructor.
Por ejemplo, su clase de servicio podría verse así:
EDITAR: Actualizado con la API de liberación GA (2.0.135)
class MyService : StatefulService
{
public MyService (StatefulServiceContext context, IReliableStateManager stateManager)
:base (context, stateManager)
{
}
public void MyMethod()
{
// do stuff..
}
}
Entonces puedes probar tu clase de servicio así:
[TestMethod]
public TestMyMethod()
{
MockReliableStateManager stateManager = new MockReliableStateManager();
MyService target = new MyService(stateManager);
target.MyMethod();
// validate results and all that good stuff
}
Tenemos un ejemplo completo de servicios reales con muchas dependencias que están siendo probadas por unidades disponibles en GitHub: https://github.com/Azure-Samples/service-fabric-dotnet-management-party-cluster
Este ejemplo tiene simulacros de IReliableStateManager e IReliableDictionary, así que puede utilizar como punto de partida para sus propias pruebas de unidad.
Para burlarse del gerente estatal en Reliable Actors, puedes hacer algo como esto:
private readonly IActorStateManager _stateManager;
public MyActor(IActorStateManager stateManager = null)
{
_stateManager = stateManager ?? this.StateManager;
}
En realidad, el StateManager
aún no se ha inicializado en este momento. Podemos obtenerlo cuando se llama a OnActivateAsync
:
private IActorStateManager _stateManager;
// Unit tests can inject mock here.
public MyActor(IActorStateManager stateManager = null)
{
_stateManager = stateManager;
}
protected override async Task OnActivateAsync()
{
if (_stateManager == null)
{
_stateManager = StateManager;
}
}
Solo asegúrese de usar siempre _stateManager
en el resto del código en lugar de this.StateManager
.