Написание UnitTests для класса приложения Service Fabric

#c# #.net #unit-testing #moq #azure-service-fabric

#c# #.net #модульное тестирование #moq #azure-service-fabric

Вопрос:

Я пишу модульные тесты для класса приложения Service Fabric. Я сталкиваюсь с некоторыми ошибками, которые я не понимаю, как исправить. Определение класса имеет вид:

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

Приложение имеет тестовый класс, определенный следующим образом:

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

Я получаю следующую ошибку:

Не указан аргумент, соответствующий требуемому формальному параметру ‘context’ ‘SearchServiceClass.SearchServiceClass(StatelessServiceContext)’.

Может кто-нибудь, пожалуйста, скажите мне, как это исправить?

Редактировать: я просматривал ServiceFabric.Mocks. Я понимаю, что мне нужно использовать MockStatelessServiceContextFactory.Default для создания макетного контекста. Как мне это сделать, правильно ли это?:

 var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
 

Комментарии:

1. Конструктор SearchServiceClass принимает один параметр, поэтому вам нужно передать его при создании его объекта. Поскольку вы не можете не создавать объект StatelessServiceContext so, вы должны использовать макет при вызове конструктора.

2. Если вы не хотите использовать поведение по умолчанию, это правильный путь. В противном случае вы можете создать новый MockStatefulServiceContextFactory using MockStatefulServiceContextFactory.Create() со всеми требуемыми параметрами. Использование значения по умолчанию разрешено на основе примера кода.

Ответ №1:

Да, вы можете использовать библиотеку ServiceFabric.Mocks для создания тестового экземпляра вашего сервиса, используя следующий код:

 var serviceInstance = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
 

В качестве альтернативы Default контексту вы также можете создать настраиваемый экземпляр:

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

 

Смотрите Этот пример теста и этот для получения дополнительной информации.