Preguntas específicas sobre las aplicaciones de Service Fabric de prueba unitaria mediante Mocks
Esta pregunta es una continuación de: Escribir UnitTests para una clase de aplicación de Service Fabric
La definición de mi aplicación es del tipo: simplificada para resolver el problema más básico que estoy enfrentando:
namespace SearchService
{
internal sealed class SearchServiceClass : StatelessService
{
//variables defined followed by constructor
private string jsonStr;
public SearchServiceClass(StatelessServiceContext context)
: base(context)
{
try
{
var dataPackage = Context.CodePackageActivationContext
.GetDataPackageObject("Data");
jsonStr = File.ReadAllText(dataPackage.Path + @"\data.json");
}
catch
{
//exception handling code
throw;
}
}
public bool IsDataJsonLoaded
{
get
{
return !(jsonStr == null);
}
}
}
}
Y la clase de prueba se ve así:
namespace SearchService.Tests
{
[TestClass]
public class SearchServiceClassTest
{
[TestMethod]
public void SearchServiceClassConstructor()
{
var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
}
}
}
La excepción que obtengo es que "System.NullReferenceException: referencia de objeto no establecida en una instancia de un objeto ", que surge del hecho de que "dataPackage.Path" no se establece en un valor válido en el "var dataPackage = Context .CodePackageActivationContext.GetDataPackageObject ("Datos"); " línea.
¿Cómo puedo replicar CodePackageActivationContext usando el simulacro? Los "Datos" aquí se refieren a DataPackage, que es una carpeta con el nombre "Datos" y reside con el código de SearchServiceClass.
Respuestas
Puede usar el siguiente fragmento de código para simular la línea:
var codePackageActivationContext = new Mock<ICodePackageActivationContext>();
Para obtener más información, consulte esto: ¿Cómo usar el marco Moq para realizar pruebas unitarias de tejidos de servicio azure?
Para la siguiente consulta:
Otra cosa que no entiendo completamente, son las variables y los miembros que se crean en la clase, pero antes de que se llame al constructor. Por ejemplo, "cadena privada jsonStr;" la línea parece ejecutarse sin problemas en la prueba unitaria, aunque solo estoy llamando al constructor en la prueba unitaria, y la "cadena privada jsonStr;" está fuera del constructor. Entonces, ¿se aplicará lo mismo a todas las variables creadas fuera del constructor?
Aquí, se trata de un código C # simple: en la línea private string jsonStr;
, se define jsonStr. Pero, antes de hacer referencia a él, debe inicializarlo; de lo contrario, arrojará un error de referencia nulo, lo que está haciendo en su constructor.