Konkretne pytania dotyczące aplikacji Service Fabric do testowania jednostkowego przy użyciu makiet
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
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.