Questions spécifiques sur les applications Service Fabric de test unitaire à l'aide de Mocks

Dec 17 2020

Cette question fait suite à: Ecrire des tests unitaires pour une classe d'application Service Fabric

Ma définition d'application est du type - simplifiée pour résoudre les problèmes les plus élémentaires auxquels je suis confronté:

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);
            }
        }
    }
}

Et la classe de test ressemble à:

namespace SearchService.Tests
{
    [TestClass]
    public class SearchServiceClassTest
    {
        [TestMethod]
        public void SearchServiceClassConstructor()
        {
           var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
           Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
        }
    }
}

L'exception que j'obtiens est que "System.NullReferenceException: Object reference not set to an instance of an object. " Qui découle du fait que "dataPackage.Path" n'est pas défini sur une valeur valide dans le "var dataPackage = Context .CodePackageActivationContext.GetDataPackageObject ("Données"); " ligne.

Comment répliquer le CodePackageActivationContext à l'aide de la maquette? Le «Data» ici fait référence à DataPackage qui est un dossier du nom «Data» et réside avec le code de SearchServiceClass.

Réponses

1 singhh-msft Dec 17 2020 at 17:31

Vous pouvez utiliser le morceau de code ci-dessous pour simuler la ligne:

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

Pour plus d'informations, consultez ceci: Comment utiliser le framework Moq pour tester des unités de service Azure Azure?

Pour la requête ci-dessous:

Une autre chose que je ne comprends pas complètement, ce sont les variables et les membres créés dans la classe, mais avant que le constructeur ne soit appelé. Par exemple, "chaîne privée jsonStr;" La ligne semble être exécutée sans problème dans le test unitaire, même si je n'appelle que le constructeur dans le test unitaire, et la "chaîne privée jsonStr;" est en dehors du constructeur. La même chose s'appliquera-t-elle à toutes les variables créées en dehors du constructeur?

Ici, il s'agit d'un simple code C #: dans la ligne private string jsonStr;, jsonStr est défini. Mais, avant de le référencer, vous devez l'initialiser, sinon il générera une erreur de référence nulle - ce que vous faites dans votre constructeur.