Preguntas específicas sobre las aplicaciones de Service Fabric de prueba unitaria mediante Mocks

Dec 17 2020

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

1 singhh-msft Dec 17 2020 at 17:31

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.