2 Stimmen

Wie man eine ReadOnlyCollection<T>-Eigenschaft mit moq nachahmt

Ich versuche, diese ReadOnlyCollection-Eigenschaft nachzubilden:

private readonly IList<MyClass> myList = new List<MyClass>();
public virtual ReadOnlyCollection<MyClass> MyList
{
   get
   {
       return new ReadOnlyCollectionBuilder<MyClass>(this.myList).ToReadOnlyCollection();
   }
}

mit dieser Attrappe (wie gesehen aquí ):

IList<MyClass> mockList = GetElements();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.myList).Returns(mockList);

Zur Laufzeit erhalte ich jedoch eine InvalidCastException:

Unable to cast object of type 'System.Collections.Generic.List`1[MyClass]' to
type 'System.Collections.ObjectModel.ReadOnlyCollection`1[MyClass]'.

Was mache ich falsch?

2voto

Sergey Berezovskiy Punkte 223446

Angenommen, Ihr Code sieht wirklich so aus (sonst wird er nicht kompiliert):

// Arrange
IList<MyClass> stakeHoldersList= GetElements();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.MyList).Returns(stakeHoldersList);
// Act on SUT which uses mockObj

Sie haben die Eigenschaft MyList vom Typ ReadOnlyCollection<MyClass> aber Sie versuchen, zurückzukehren IEnumerable<MyClass> . Deshalb erhalten Sie diese Fehlermeldung. Also, ändern:

ReadOnlyCollection<MyClass> stakeHoldersList = new ReadOnlyCollection<MyClass>(GetElements());
mockObj.SetupGet<ReadOnlyCollection<MyClass>>(o => o.MyList).Returns(stakeHoldersList);

Um solche Laufzeitfehler zu vermeiden, geben Sie den Typ der Methode SetupGet nicht an. In diesem Fall wird der Typ des Rückgabewerts vom Typ der Eigenschaft abgeleitet und Sie erhalten sofort einen Fehler (der Code wird nicht kompiliert, wenn der Typ des Rückgabewerts nicht mit dem Typ der Eigenschaft übereinstimmt):

mockObj.SetupGet(o => o.MyList).Returns(stakeHoldersList);

1voto

Trevor Pilley Punkte 15778

Sie können die private Readonly-Eigenschaft nicht nachahmen myList können Sie die öffentliche Eigenschaft MyList da sie als virtuell gekennzeichnet ist. Um dies zu tun, müssen Sie diesen Code aktualisieren:

IList<MyClass> mockList = GetElements();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.myList).Returns(mockList);

dazu:

var mockList = new ReadOnlyCollection<MyClass>(GetElements());
mockObj.Setup(o => o.MyList).Returns(mockList);

0voto

Spevy Punkte 1235

Ein bisschen spät, aber ich denke, das kann ein bisschen weniger Code sein.

mockObj.SetupGet(o => o.MyList).Returns(GetElements().AsReadOnly);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X