2012-12-24 4 views
5

Ich muss einen Ausdruck für eine bestimmte Sammlung ausführen, um festzustellen, ob der Ausdruck im Code korrekt geschrieben wird. Aus Gründen des Beispiels werde ich einen unnötigen Kontext auslassen, aber falls jemand es braucht, einfach einen Kommentar abgeben und ich werde die Frage bearbeiten und hinzufügen, was immer Sie brauchen.Wie erstelle ich diesen Ausdruck mit Moq, ohne einen Methodengruppenfehler zu erhalten?

Sagen wir, ich habe folgendes:

public interface IRepository 
{ 
    IQueryable<T> Query<T>(Expression<Func<T, bool>> expression); 
} 

public class Repository : IRepository 
{ 
    public IQueryable<T> Query<T>(Expression<Func<T, bool>> expression) 
    { 
     return _session.Query<T>(expression); 
    } 
} 

und ich möchte eine Spezifikation wie folgt schreiben:

internal class when_executing_some_query : given_some_repository_context 
{ 
    Establish context =() => 
    { 
     IQueryable<SomeObject> objects = new List<SomeObject> 
     { 
      SomeObject1, 
      SomeObject2, 
      SomeObject3, 
     }.AsQueryable(); 

     _expectedList = new List<SomeObject> 
     { 
      SomeObject1, 
      SomeObject2, 
     }; 

     MockedRepository.Setup(x => x.Query<SomeObject>(Moq.It.IsAny<Expression<Func<SomeObject, bool>>>) 
      .Callback<Expression<Func<SomeObject, bool>>>(expression => _actualExpression = expression); 
    } 

    Because of =() => _actualList = objects.Select(_actualExpression).ToList(); 

    It should_execute_on_queryable_and_return_the_expected_items =() => //compare _expectedList with _actualList 
} 

Aber ich bin immer Fehler auf Moq.It.IsAny<Expression<Func<SomeObject, bool>>> bauen sagen

Die beste überladene Methodenübereinstimmung für 'Project.Domain.IRepository.Query (System.Linq.Expressions.Expression>)' hat einige ungültige Argumente

und

Argument 1: Aus 'Methodengruppe' zu
'System.Linq.Expressions.Expression>' `

Antwort

13

zu beheben Fehler nicht konvertieren so müssen Sie die Methode aufrufen, nicht als Argument übergeben. Ändern Sie einfach Ihren Anruf aus:

Moq.It.IsAny<Expression<Func<SomeObject, bool>>> 

zu:

Moq.It.IsAny<Expression<Func<SomeObject, bool>>>() 

Beachten Sie die Klammern.

3

Basierend auf this answer, sieht es aus wie Sie () danach benötigen, beispielsweise It.IsAny<Expression<Func<SomeObject, bool>>>()

0

Sie enthalten eine konkrete Repository oben, aber es ist nie in dieser Spezifikation verwendet, so vertraue ich ihr nur zum Wohle Beispiel. Darüber hinaus enthält die Spezifikation ein Might-Repository und eine Setup-Abfrage-Methode, die jedoch nie ausgeführt wird. Diese Spezifikation sollte die konkrete Sache testen, die das Repository verwendet. Dann können Sie den Ausdruck vergleichen, der an die Abfrage-Methode übergeben wurde.

Ausdrücke sind schwierig, aber noch mehr mit Mocks. Was ich tue, ist Moq's Verify und dann Moq's Moq.It.Is <>, um sicherzustellen, dass die Überprüfung nur besteht, wenn der Ausdruck übereinstimmt. Hier ein Beispiel:

_repo.Verify(x=>x.Query(Moq.It.Is<Expression<Func<SomeObject, bool>>>(exp=>exp.Compile().Invoke(_exampleSomeObject))); 

Grundsätzlich hier ich Moq sage, dass das überprüft nur passiert, wenn der tatsächliche Ausdruck Arbeiten auf _exampleSomeObject gegeben.

ich das Schreiben auf meinem Iphone, so dass ich entschuldige mich, wenn der Code nicht sofort kompilieren.

Nur ein Vorschlag: Ihr da Abschnitt sollte eine Aktion ausdrücken, die ein Ergebnis verursacht. Im Moment sieht es so aus, als ob Ihr Bus nur ein Ergebnis von zuvor verarbeitet hat.

0

In Ihrer Konfiguration übergeben Sie SomeObject.
In Ihrem Rückruf fragen Sie nach InstanceHealthReport.

Auch wenn InstanceHealthReport eine Unterklasse von SomeObject ist, glaube ich, dass sie im Setup und im Callback übereinstimmen müssen.

Hoffe, dass hilft.

Colin

+0

oops, das war nur ein Tippfehler in einem Versuch, „zu machen generic“ den Code für die Buchung, vielen Dank für diesen Hinweis aus, habe ich bearbeitet entsprechend –

Verwandte Themen