Escritura de UnitTests para una clase de aplicación de Service Fabric

Dec 16 2020

Estoy escribiendo pruebas unitarias para una clase de aplicación de Service Fabric. Me estoy encontrando con algunos errores que no entiendo cómo solucionar. La definición de clase es del tipo:

namespace SearchService
{
    internal sealed class SearchServiceClass : StatelessService
    {
        //variables defined followed by constructor
        private string jsonStr;
        public SearchServiceClass(StatelessServiceContext context)
            : base(context)
        {
            //constructor stuff
        }
        
        public bool IsDataJsonLoaded
        {
            get
            {
                return !(jsonStr == null);
            }
        }
    }
}

La aplicación tiene una clase de prueba definida de la siguiente manera:

namespace SearchService.Tests
{
    //[TestClass]
    public class SearchServiceClassTest
    {
        [Fact]
        public void SearchServiceClassConstructor()
        {
           var searchServiceClass = new SearchServiceClass();
           Assert.True(searchServiceClass.IsDataJsonLoaded);
        }
    }
}

Obtuve el siguiente error:

No hay ningún argumento dado que corresponda al parámetro formal requerido 'contexto' de 'SearchServiceClass.SearchServiceClass (StatelessServiceContext)'.

¿Podría alguien decirme cómo solucionar esto?

Editar: He estado mirando ServiceFabric.Mocks. Lo que entiendo es que necesito usar el MockStatelessServiceContextFactory.Defaultpara crear un contexto simulado. ¿Cómo hago esto? ¿Es la siguiente la manera correcta ?:

var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);

Respuestas

1 LoekD Dec 16 2020 at 18:46

Sí, puede usar la biblioteca ServiceFabric.Mocks para crear una instancia de prueba de su servicio usando el siguiente código:

var serviceInstance = new SearchServiceClass(MockStatelessServiceContextFactory.Default);

Como alternativa al Defaultcontexto, también puede crear una instancia personalizada:

var newUri = new Uri("fabric:/MockApp/OtherMockStatelessService");
var serviceTypeName = "OtherMockServiceType";
var partitionId = Guid.NewGuid();
var replicaId = long.MaxValue;
var context = new MockCodePackageActivationContext("fabric:/MyApp", "MyAppType", "Code", "Ver", "Context", "Log", "Temp", "Work", "Man", "ManVer");
var context = MockStatelessServiceContextFactory.Create(context, serviceTypeName, newUri, partitionId, replicaId);
var serviceInstance = new SearchServiceClass(context);

Vea esta prueba de muestra y esta para obtener más información.