Ich weiß, dass ich ein Objekt neu kann und gebe es in aber ich versuche, die Syntax und Muster zu entsprechen, da der Wert eigentlich nie verwendet.Moq - Methode Auswertung mit Nullable-Parameter wirft null Ausnahme
Umsetzung:
public interface IDemoProvider
{
string GetStringById(int? id);
}
public interface IDemoService
{
bool Validate(ServiceRequest request);
}
public class ServiceRequest
{
public string foo { get; set; }
public int? bar { get; set; }
}
public class SomeDemoProvider : IDemoProvider
{
public virtual string GetStringById(int? id)
{
if (id != null)
return "success";
else
return "else";
}
}
public class BaseDemoService : IDemoService
{
public IDemoProvider Provider { get; set; }
public virtual bool Validate(ServiceRequest request)
{
if (request.bar == null)
return false;
return true;
}
}
public class SomeDemoService : BaseDemoService
{
public SomeDemoService(IDemoProvider provider)
{
Provider = provider;
}
public virtual string Post(ServiceRequest request)
{
if (!Validate(request))
throw new Exception("Invalid Request");
return Provider.GetStringById(request.bar);
}
}
Testcode:
[TestFixture]
public class ProgramTests
{
[Test]
public void SomeDemoServiceTest()
{
var mockProvider = new Mock<IDemoProvider>();
mockProvider.Setup(p => p.GetStringById(It.IsAny<int?>())).Returns(() => "success");
object[] args = { mockProvider.Object };
var mockService = new Mock<SomeDemoService>(args) {CallBase = true};
mockService.Setup(s => s.Validate(It.IsAny<ServiceRequest>())).Returns(true);
string result = mockService.Object.Post(It.IsAny<ServiceRequest>());
Assert.AreEqual("success", result);
}
}
Ausgabe
Dieses in einem NullReferenceException
führt, die Sinn macht, da es versucht,zu lösenwährend der Ausführung, die auf Anforderungsebene null ist.
Wenn ich jedoch den Parameter mit null
ersetzen, es funktioniert gut:
return Provider.GetStringById(null);
hier Meine Frage ist, ob eine Möglichkeit gibt es die Abfangjäger zu machen erkennen, bevor die Expression der Bewertung, dass es sollte nur den Wert zurückgeben statt zu versuchen, den Ausdruck zu bewerten.
Ich kann den Rest des Request-Objekts verspotten, aber es scheint dumm, da die Werte nie verwendet werden, nach dem Test. Die wirkliche Frage hier ist, ob ich den Code oder den Test anders schreiben sollte, um dieses Szenario zu vermeiden, oder wenn ich ein Problem mit einem einfachen Workaround verkompliziere.
Die Auswertung geschieht * vor * das Verfahren überhaupt aufgerufen wird. Also - nein, es ist nicht möglich, das ohne eine * ernsthafte * Vorverarbeitung Ihrer Bibliotheken zu haben. Ihr Code in "Post" sollte den Fall behandeln, in dem "request" null ist. Wenn es ungültig ist, dass "request" null ist, dann ist Ihr Test ungültig (es sollte ein Test sein, der behauptet, dass es ungültig ist, eine Null-Anfrage zu bestehen).Dies ist ein XY-Problem - und zum Glück für Sie - zeigt dieses Verhalten entweder einen Fehler in Ihrem Code oder ein Missverständnis dessen, was Sie testen – Rob
Ich nehme auch an, "GetStoreByStoreReferenceId" sollte "GetObjectById" sein? – Rob
Sie müssen diese Frage neu schreiben. In seiner jetzigen Form ist es unklar. Stellen Sie eine [mcve] zur Verfügung, mit der das Problem neu erstellt werden kann. – Nkosi