Spezifische Fragen zum Testen von Service Fabric-Anwendungen mit Mocks
Diese Frage ist eine Folge von: Schreiben von UnitTests für eine Service Fabric-Anwendungsklasse
Meine Anwendungsdefinition ist vom Typ - vereinfacht, um die grundlegendsten Probleme zu lösen, mit denen ich konfrontiert bin:
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);
}
}
}
}
Und die Testklasse sieht aus wie:
namespace SearchService.Tests
{
[TestClass]
public class SearchServiceClassTest
{
[TestMethod]
public void SearchServiceClassConstructor()
{
var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
}
}
}
Die Ausnahme, die ich erhalte, ist, dass "System.NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt " ist, was darauf zurückzuführen ist, dass "dataPackage.Path" im "var dataPackage = Context" nicht auf einen gültigen Wert festgelegt wird .CodePackageActivationContext.GetDataPackageObject ("Data"); " Linie.
Wie repliziere ich den CodePackageActivationContext mithilfe des Mocks? Die "Daten" beziehen sich hier auf DataPackage, einen Ordner mit dem Namen "Data", der sich im Code für die SearchServiceClass befindet.
Antworten
Sie können den folgenden Code verwenden, um die Zeile zu verspotten:
var codePackageActivationContext = new Mock<ICodePackageActivationContext>();
Weitere Informationen finden Sie hier: Wie verwende ich das Moq-Framework, um Azure-Service-Fabrics zu testen?
Für folgende Abfrage:
Eine andere Sache, die ich nicht ganz verstehe, sind Variablen und Mitglieder, die in der Klasse erstellt werden, aber bevor der Konstruktor aufgerufen wird. Zum Beispiel "private Zeichenfolge jsonStr;" line scheint im Unit Test ohne viel Aufhebens ausgeführt zu werden, obwohl ich nur den Konstruktor im Unit Test und den "privaten String jsonStr" aufrufe; ist außerhalb des Konstruktors. Gilt das auch für alle Variablen, die außerhalb des Konstruktors erstellt wurden?
Hier geht es um einen einfachen C # -Code: In der Zeile private string jsonStr;
wird jsonStr definiert. Bevor Sie jedoch darauf verweisen, sollten Sie es initialisieren, da sonst ein Nullreferenzfehler ausgegeben wird - was Sie in Ihrem Konstruktor tun.