Moq Params TargetParameterCountException : Parameter count mismatch Ausnahme
Folgende ist meine generische base-repository-Schnittstelle
public interface IRepository<T>
{
IQueryable<T> AllIncluding(params Expression<Func<T,
object>>[] includeProperties);
}
meine Person
public class Sdk
{
public Sdk()
{
this.Identifier = Guid.NewGuid().ToString();
}
public virtual ICollection<Resource> AccessibleResources { get; set; }
public string Identifier { get; set; }
}
und im folgenden ist der spezifische repo -
public interface ISdkRepository : IRepository<Sdk>
{
}
nun bin ich versuchen zu testen, ein controller, mit moq
Folgende code ist der code, den ich versuche zu testen
public ActionResult GetResources(string clientId) {
var sdkObject = sdkRepository
.AllIncluding(k => k.AccessibleResources)
.SingleOrDefault(k => k.Identifier == clientId);
if (sdkObject == null)
throw new ApplicationException("Sdk Not Found");
return Json(sdkObject.AccessibleResources.ToList());
}
mit dem folgenden test
[Test]
public void Can_Get_GetResources()
{
var cid = Guid.NewGuid().ToString();
var mockRepo = new Moq.Mock<ISdkRepository>();
var sdks = new HashSet<Sdk>()
{
new Sdk()
{
Identifier = cid,
AccessibleResources = new HashSet<Resource>()
{
new Resource()
{
Id = Guid.NewGuid(),
Description = "This is sdk"
}
}
}
};
mockRepo.Setup(k => k.
AllIncluding(It.IsAny<Expression<Func<Sdk,object>>[]>()))
.Returns(sdks.AsQueryable);
var sdkCtrl = new SdksController(mockRepo.Object);
var returnedJson=sdkCtrl.GetResources(cid);
returnedJson.ToString();
}
und es ist zu werfen:
System.Reflexion.TargetParameterCountException : Parameter count mismatch
Weiß nicht, warum?
Können Sie fügen Sie den Stack-Trace ?
InformationsquelleAutor AmanT | 2011-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Sie getroffen haben einige Einschränkungen hier mit Moq. Es nicht handhaben Ausdruck Parametern gut, weil es übergeben werden kann Ausdrücke als Werte an sich. Es gibt keine Möglichkeit für Moq zu wissen, welcher Teil des Ausdrucks soll aufgelöst werden, und was ist Teil der Signatur.
Auch, ich kann mich nicht daran erinnern, wie gut Moq Griffe params xx[] aber es ist durchaus möglich, dass Sie eine Kombination von zwei Probleme hier.
Sind Sie in der Lage, eine Klasse zu erstellen, dass macht die Menge der Ausdrücke, die als Eigenschaft? Wenn dem so ist, ist es möglich, ändern Sie die Signatur der AllIncluding und sagen Moq passend auf jede Instanz der Klasse.
Update
Zum Zeitpunkt der Beantwortung dieser war eine Beschränkung, sondern ist jetzt möglich. Siehe die Antwort von Oleksandr Lytvyn
InformationsquelleAutor
Aber es ist eine Antwort, als angenommen markiert, ich glaube, es ist ein Weg, zu verhöhnen, Ihre repository korrekt.
Statt
nutzen Sie bitte
Danke!!! gespeichert mich zu Stossen
Genial! Gearbeitet. Gibt es eine Erklärung, wie es funktioniert (was dieser eigentlich macht)?
der Grund, warum es funktioniert, wie es funktioniert, ist, dass Sie gesagt haben, Moq, dass
AllIncluding
erwartet (überIt.IsAny<TExpected>
) einen parameter, abersdks.AsQueryable()
ist eine(n-Erweiterung) - Methode, die keine Parameter. Da kann man nur den Namen der Methode als Abkürzung für die Delegierten, können Sie es kompilieren, aber schlägt fehl, wenn Moq bewertet. Gibt es eine explizite delegieren, die gibt die ausgewertet.AsQueryable
dann passt das erwartete Muster.InformationsquelleAutor
Andere Lösung für dieses Problem ist:
.AsQueryable()
statt.AsQueryable
.InformationsquelleAutor
Für andere Menschen auf der Suche nach Antwort auf diese die Lösung für mich war das hinzufügen der gleichen Anzahl von Parametern in
Setup
wie im Ausdruck inReturns
.Zum Beispiel:
Nicht arbeiten mit verschiedenen argument count
Arbeiten mit der gleichen Menge der Argumente im Ausdruck in
Returns
wie inSetup
InformationsquelleAutor