Perguntas específicas sobre testes de unidade de aplicativos do Service Fabric usando simulações

Dec 17 2020

Esta pergunta é uma continuação de: Escrevendo UnitTests para uma classe de aplicativo do Service Fabric

Minha definição de aplicativo é do tipo - simplificada para resolver o mais básico dos problemas que estou enfrentando:

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

E a classe de teste se parece com:

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

A exceção que recebo é que "System.NullReferenceException: Referência de objeto não definida para uma instância de um objeto. " Que surge do fato de que "dataPackage.Path" não está sendo definido com um valor válido em "var dataPackage = Context .CodePackageActivationContext.GetDataPackageObject ("Data"); " linha.

Como faço para replicar o CodePackageActivationContext usando o mock? Os "Dados" aqui se referem a DataPackage, que é uma pasta com o nome "Dados" e reside com o código para SearchServiceClass.

Respostas

1 singhh-msft Dec 17 2020 at 17:31

Você pode usar o trecho de código abaixo para simular a linha:

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

Para obter mais informações, verifique: Como usar a estrutura Moq para testar unidades de fabrics de serviço azul?

Para a consulta abaixo:

Outra coisa que não entendo completamente são as variáveis ​​e os membros que estão sendo criados na classe, mas antes que o construtor seja chamado. Por exemplo, "string privada jsonStr;" linha parece ser executada sem problemas no Teste de Unidade, embora eu esteja apenas chamando o construtor no Teste de Unidade e a "string privada jsonStr;" está fora do construtor. Então, o mesmo se aplica a todas as variáveis ​​criadas fora do construtor?

Aqui, trata-se de um código C # simples: Na linha private string jsonStr;, jsonStr é definido. Mas, antes de referenciá-lo, você deve inicializá-lo, caso contrário, ele lançará um erro de referência nula - o que você está fazendo em seu construtor.