Perguntas específicas sobre testes de unidade de aplicativos do Service Fabric usando simulações
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
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.