Spezifische Fragen zum Testen von Service Fabric-Anwendungen mit Mocks

Dec 17 2020

Diese Frage ist eine Folge von: Schreiben von UnitTests für eine Service Fabric-Anwendungsklasse

Meine Anwendungsdefinition ist vom Typ - vereinfacht, um die grundlegendsten Probleme zu lösen, mit denen ich konfrontiert bin:

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

Und die Testklasse sieht aus wie:

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

Die Ausnahme, die ich erhalte, ist, dass "System.NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt " ist, was darauf zurückzuführen ist, dass "dataPackage.Path" im "var dataPackage = Context" nicht auf einen gültigen Wert festgelegt wird .CodePackageActivationContext.GetDataPackageObject ("Data"); " Linie.

Wie repliziere ich den CodePackageActivationContext mithilfe des Mocks? Die "Daten" beziehen sich hier auf DataPackage, einen Ordner mit dem Namen "Data", der sich im Code für die SearchServiceClass befindet.

Antworten

1 singhh-msft Dec 17 2020 at 17:31

Sie können den folgenden Code verwenden, um die Zeile zu verspotten:

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

Weitere Informationen finden Sie hier: Wie verwende ich das Moq-Framework, um Azure-Service-Fabrics zu testen?

Für folgende Abfrage:

Eine andere Sache, die ich nicht ganz verstehe, sind Variablen und Mitglieder, die in der Klasse erstellt werden, aber bevor der Konstruktor aufgerufen wird. Zum Beispiel "private Zeichenfolge jsonStr;" line scheint im Unit Test ohne viel Aufhebens ausgeführt zu werden, obwohl ich nur den Konstruktor im Unit Test und den "privaten String jsonStr" aufrufe; ist außerhalb des Konstruktors. Gilt das auch für alle Variablen, die außerhalb des Konstruktors erstellt wurden?

Hier geht es um einen einfachen C # -Code: In der Zeile private string jsonStr;wird jsonStr definiert. Bevor Sie jedoch darauf verweisen, sollten Sie es initialisieren, da sonst ein Nullreferenzfehler ausgegeben wird - was Sie in Ihrem Konstruktor tun.