Pisanie testów UnitTests dla klasy aplikacji sieci szkieletowej usług

Dec 16 2020

Piszę testy jednostkowe dla klasy aplikacji sieci szkieletowej usług. Występują błędy, których nie rozumiem, jak je naprawić. Definicja klasy jest tego rodzaju:

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

Aplikacja posiada klasę testową zdefiniowaną w następujący sposób:

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

Otrzymuję następujący błąd:

Nie podano argumentu, który odpowiada wymaganemu parametrowi formalnemu „context” elementu „SearchServiceClass.SearchServiceClass (StatelessServiceContext)”.

Czy ktoś mógłby mi powiedzieć, jak to naprawić?

Edycja: patrzyłem na ServiceFabric.Mocks. Rozumiem, że muszę użyć MockStatelessServiceContextFactory.Defaultdo stworzenia pozorowanego kontekstu. Jak to zrobić, czy postępuję zgodnie z właściwą drogą ?:

var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);

Odpowiedzi

1 LoekD Dec 16 2020 at 18:46

Tak, możesz użyć biblioteki ServiceFabric.Mocks , aby utworzyć testową instancję usługi, używając następującego kodu:

var serviceInstance = new SearchServiceClass(MockStatelessServiceContextFactory.Default);

Jako alternatywę dla Defaultkontekstu możesz również zbudować niestandardową instancję:

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

Zobacz ten przykładowy test i ten, aby uzyskać więcej informacji.