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.
InformationsquelleAutor Mark Rogers | 2009-04-26
Schreibe einen Kommentar