Wie wollen Sie stub IQueryable<T>.Wo(Func<T, bool>) mit Rhino Mocks?
In der .net 3.5 Projekt, an dem ich derzeit arbeite, schrieb ich einige tests für eine service-Klasse.
public class ServiceClass : IServiceClass
{
private readonly IRepository _repository;
public ServiceClass(IRepository repository)
{
_repository = repository;
}
#region IServiceClass Members
public IEnumerable<ActionType> GetAvailableActions()
{
IQueryable<ActionType> actionTypeQuery = _repository.Query<ActionType>();
return actionTypeQuery.Where(x => x.Name == "debug").AsEnumerable();
}
#endregion
}
und ich hatte eine harte Zeit, herauszufinden, wie stub-oder mock-die
actionTypeQuery.Where(x => x.Name == "debug")
Teil.
Hier ist, was ich so weit gekommen:
[TestFixture]
public class ServiceClassTester
{
private ServiceClass _service;
private IRepository _repository;
private IQueryable<ActionType> _actionQuery;
[SetUp]
public void SetUp()
{
_repository = MockRepository.GenerateMock<IRepository>();
_service = new ServiceClass(_repository);
}
[Test]
public void heres_a_test()
{
_actionQuery = MockRepository.GenerateStub<IQueryable<ActionType>>();
_repository.Expect(x => x.Query<ActionType>()).Return(_actionQuery);
_actionQuery.Expect(x => x.Where(y => y.Name == "debug")).Return(_actionQuery);
_service.GetAvailableActions();
_repository.VerifyAllExpectations();
_actionQuery.VerifyAllExpectations();
}
}
[Anmerkung: Klasse Namen geändert zum Schutz der unschuldigen]
Aber dieser schlägt mit einem System.NullReferenceException
bei
_actionQuery.Expect(x => x.Where(y => y.Name == "debug")).Return(_actionQuery);
Also meine Frage ist:
Wie kann ich verspotte oder stub die IQueryable.Wo Funktion mit RhinoMocks und Holen Sie sich diesen test zu bestehen?
Wenn mein Aktuelles setup wird mir nicht erlauben, Sie zu verspotten oder stub IQueryable, dann eine mit Gründen versehene Erklärung, warum.
Danke für das Lesen dieses überlangen Frage.
- Die beiden top-zwei Antworten waren von hoch genug Qualität, um Sie auszuwählen. Vielen Dank, sorry, wenn ich nicht wählen Sie Ihre.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich wollte zunächst mock-out-rufe, wie " IQueryable.Wo(Func)' auch, aber ich denke, es ist die Prüfung auf der falschen Ebene. Statt in meinen tests, die ich nur noch verspottet aus IQueryable und überprüfen Sie dann das Ergebnis:
Ohne Verwendung von Rhino mocks, können Sie eine Liste erstellen und dann zu rufen .AsQueryable() auf. z.B.
Dass Sie wenigstens eine fake-repository, aber es wird nicht lassen Sie überprüfen, ob die Methoden aufgerufen wurden.
Where
ist eine Erweiterung Methode, dies ist nicht eine Methode implementiert, die durch die Schnittstelle IQueriable. Blick auf die Mitglieder der IQueriable: http://msdn.microsoft.com/en-us/library/system.linq.iqueryable_members.aspxErweiterung die Methode ist statisch und kann nicht verspottet werden. IMO, gibt es keine Notwendigkeit, zu verspotten
Where
, weil es Teil der Sprache. Sollten Sie nur spotten, das repository.Bearbeiten, Beispiel:
Hinweis: Sie brauchen nicht zu erwarten, dass die anrufen, weil Ihre Methode hängt von der return-Wert der mock. Wenn Sie nicht mitgehen würde, es würde nicht auf die Bestätigungen. Das macht das testen einfacher zu pflegen.
Ich habe ähnliches problem, wo ich versuchte, stub-Prädikat-Ausdruck zu Finden-Methode, die string enthält, aber String ist reference type und unveränderlich, natürlich. Kein Erfolg, bis ich habe erstellen testPredicate, die ich übergeben, um auszudrücken, eigentliche SUT und schließlich zu behaupten. Unten code funktioniert.