| 

.NET C# Java Javascript Exception

1
Bei der Anwendung handelt es sich um einen Service, der bei bestimmten Szenarios spezifische WorkItems aus dem TeamFoundationServer anpasst.

[Then(@"muessen die Felder GDV.Number, GDV.NumberOfTimeRegistration, AreaPath und Titel des Paketes angepasst werden")]
public void DannMuessenDieFelderGDV_NumberGDV_NumberOfTimeRegistrationAreaPathUndTitelDesPaketesAngepasstWerden()
{
//die zu ändernden Field müssen im Mock enthalten sein
var fields = new Dictionary<string, IField>
{
{ "GDV.Number", fieldMock.Object },
{ "GDV.NumberOfTimeRegistration", fieldMock.Object }
};
workItemMock.Setup(x => x.Fields).Returns(fields);

workItemMock.Setup(x => x.Title).Returns("CR0123 Hier steht etwas");
automation.Execute(workItemChangedEventMock.Object, tfsIdentityAdapter);

workItemMock.VerifySet(x => x.Title = "Hier steht etwas", Times.Once());
workItemMock.VerifySet(x => x.AreaPath = "Änderungen", Times.Once());
workItemMock.VerifySet(x => x.Fields["GDV.Number"].Value = string.Empty, Times.Once());
workItemMock.VerifySet(x => x.Fields["GDV.NumberOfTimeRegistration"].Value = string.Empty, Times.Once());
}
Die Ausführung des Tests läuft durch aber beim VerifySet der beiden Dictionary-Elemente erhalte ich eine NULL Reference Exception. Das Dictionary Fields auf dem WorkItem existiert nicht. Lesend kann ich auf die Elemente zugreifen, da sie gemockt sind mit MOQ.

Wie kann ich verifizieren, dass die Werte mit den spezifischen Schlüsseln angepasst wurden?
16.02.2011
Sandra 11 1
2 Antworten
1
Es wäre hilfreich wenn du noch zeigen könntest wie du die workitemMock und den fieldMock erstellst bzw. wie die zu mockende Schnittstelle aussieht.

Wenn ich es richtig sehe, musst du hier aber nicht Verify nutzen. Es ginge auch, wenn du dir den Anfangszustand deines Dictionaries merkst, also bevor du es in Form des workItemMocks hinein gibst, und dann mit dem Zustand des Dictionaries nach der Verarbeitung prüfst.

Das könnte dann grob so aussehen:

var expected = new Dictionary<string, IField>
{
{ "GDV.Number", fieldMock.Object },
{ "GDV.NumberOfTimeRegistration", fieldMock.Object }
};
// arrange
var actual = new Dictionary<string, IField>
{
{ "GDV.Number", fieldMock.Object },
{ "GDV.NumberOfTimeRegistration", fieldMock.Object }
};

workItemMock.Setup(x => x.Fields).Returns(fields);

// act
automation.Execute(workItemChangedEventMock.Object, tfsIdentityAdapter);

// assert
foreach(var key in expected.Keys )
{
Assert.IsTrue(actual.ContainsKey(key));
Assert.AreNotEqual(expected[key], actual[key]);
}


Damit würdest du jetzt erwarten, dass sich alle Werte geändert haben und demnach wurde auch ein Set ausgeführt.

Wenn das Dictionary fields nicht mehr existiert, kann das aber auch ein Hinweis auf ein Bug in deiner Implementierung sein. Immerhin wäre es ja denkbar, dass die Fields mit null überschrieben werden.
16.02.2011
Hendrik Lösch 1,4k 8
0
Die Lösung mit dem Verify gefällt mir persönlich sehr gut, da ich die verschiedenen Werte so gezielt prüfen kann.

Der Ansatz mit der Überprüfung der konkreten Mocks hat zur Lösung des Problems beigetragen.

Die geänderte Methode sieht nun folgendermaßen aus:
[Then(@"muessen die Felder GDV.Number, GDV.NumberOfTimeRegistration, AreaPath und Titel des Paketes angepasst werden")]
public void DannMuessenDieFelderGDV_NumberGDV_NumberOfTimeRegistrationAreaPathUndTitelDesPaketesAngepasstWerden()
{
var numberFieldMock = new Mock<IField>();

//die zu ändernden Field müssen im Mock enthalten sein
var fields = new Dictionary<string, IField>
{
{ "GDV.Number", numberFieldMock.Object },
{ "GDV.NumberOfTimeRegistration", fieldMock.Object }
};
workItemMock.Setup(x => x.Fields).Returns(fields);

workItemMock.Setup(x => x.Title).Returns("CR0123 Hier steht etwas");
automation.Execute(workItemChangedEventMock.Object, tfsIdentityAdapter);

workItemMock.VerifySet(x => x.Title = "Hier steht etwas", Times.Once());
workItemMock.VerifySet(x => x.AreaPath = "Änderungen", Times.Once());

numberFieldMock.VerifySet(x => x.Value = string.Empty, Times.Once());
fieldMock.VerifySet(x => x.Value = string.Empty, Times.Once());
}
Das Problem bestand darin, dass durch den Aufruf des Verifys mit einer Lambda-Abfrage dazu führt, dass die Implementierung des Interfaces(IWorkItem) verwendet wird und nicht das eigentlich gemockte Objekt vom WorkItem, welches das Dictionary Fields enthält.

Darüberhinaus muss auf den einzelnen FieldMocks das Property verifiziert werden, das dieses ja gesetzt werden soll und daher werden auch zwei unterschiedliche Mocks benötigt um die speziellen Schlüssel zu unterscheiden.
16.02.2011
Sandra 11 1

Stelle deine .net-Frage jetzt!