Konkretne pytania dotyczące aplikacji Service Fabric do testowania jednostkowego przy użyciu makiet

Dec 17 2020

To pytanie jest kontynuacją: Pisanie testów UnitTests dla klasy aplikacji sieci szkieletowej usług

Moja definicja aplikacji jest typu - uprościłem ją, aby rozwiązać najbardziej podstawowe problemy, z którymi się borykam:

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

A klasa testowa wygląda następująco:

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

Wyjątkiem, jaki otrzymuję, jest to, że „System.NullReferenceException: odwołanie do obiektu nie jest ustawione na wystąpienie obiektu ”, co wynika z faktu, że „dataPackage.Path” nie ma ustawionej prawidłowej wartości w „var dataPackage = Context” .CodePackageActivationContext.GetDataPackageObject ("Dane"); " linia.

Jak replikować CodePackageActivationContext przy użyciu makiety? „Dane” odnosi się tutaj do pakietu danych, który jest folderem o nazwie „Data” i znajduje się w kodzie SearchServiceClass.

Odpowiedzi

1 singhh-msft Dec 17 2020 at 17:31

Możesz użyć poniższego fragmentu kodu, aby kpić z linii:

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

Aby uzyskać więcej informacji, zobacz: Jak używać platformy Moq do testowania jednostkowego sieci szkieletowych usług Azure?

Dla poniższego zapytania:

Inną rzeczą, której nie do końca rozumiem, są zmienne i składowe tworzone w klasie, ale przed wywołaniem konstruktora. Na przykład „private string jsonStr;” wydaje się, że linia jest wykonywana bez zamieszania w teście jednostkowym, mimo że wywołuję konstruktor tylko w teście jednostkowym, a "prywatny ciąg jsonStr;" znajduje się poza konstruktorem. Czy to samo dotyczy wszystkich zmiennych utworzonych poza konstruktorem?

Tutaj chodzi o prosty kod C #: w linii private string jsonStr;zdefiniowano jsonStr. Ale przed odwołaniem się do niego należy go zainicjować, w przeciwnym razie zgłosi błąd odniesienia zerowego - co robisz w swoim konstruktorze.