2011-09-14 9 views
10

Poniżej moja rodzajowy interfejs repozytorium bazaMoq Params TargetParameterCountException: Parametr count niedopasowanie Wyjątek

public interface IRepository<T> 
{ 
    IQueryable<T> AllIncluding(params Expression<Func<T, 
           object>>[] includeProperties); 
} 

moja jednostka

public class Sdk 
{ 
    public Sdk() 
    { 
     this.Identifier = Guid.NewGuid().ToString(); 
    } 

    public virtual ICollection<Resource> AccessibleResources { get; set; } 

    public string Identifier { get; set; }  
} 

i po to specyficzna repo

public interface ISdkRepository : IRepository<Sdk> 
{ 
} 

teraz jestem próby przetestowania kontrolera za pomocą moq

Poniżej znajduje się kod próbuję przetestować

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()); 
    } 

stosując następujące testy

[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(); 
} 

i rzuca:

System.Reflection.TargetParameterCountException: Parametr count niedopasowanie

Nie wiem, dlaczego?

+0

Can wkleiłeś stos śledzenia? – Raghu

Odpowiedz

4

Wydaje mi się, że wprowadziłeś tutaj pewne ograniczenia z Moq. Nie obsługuje on dobrze parametrów wyrażenia, ponieważ można przekazywać wyrażenia jako same wartości. Moq nie może wiedzieć, która część wyrażenia ma zostać rozwiązana i co jest częścią podpisu.

Ponadto, nie pamiętam, jak dobrze Moq obsługuje params xx [], ale jest całkiem możliwe, że masz tu połączenie dwóch problemów.

Czy jesteś w stanie utworzyć klasę, która eksponuje zestaw wyrażeń jako właściwość? Jeśli tak, to może być możliwa zmiana sygnatury AllIncluding i wskazanie Moq, aby dopasował się do każdej instancji tej klasy.

Aktualizacja

W momencie odbierania było to ograniczenie, ale teraz jest to możliwe. Zobacz odpowiedź Ołeksandra Łytwina:

+0

proszę spojrzeć na odpowiedź Ołeksandra Łytwyna. – Marcel

28

Chociaż istnieje odpowiedź oznaczona jako zaakceptowana, uważam, że istnieje sposób na poprawne kpiny z twojego repozytorium.

Zamiast

mockRepo.Setup(k => k.AllIncluding(It.IsAny<Expression<Func<Sdk, object>>[]>())) 
        .Returns(sdks.AsQueryable); 

skorzystaj

mockRepo.Setup(k => k.AllIncluding(It.IsAny<Expression<Func<Sdk, object>>[]>())) 
        .Returns((Expression<Func<Sdk, 
         object>>[] includeProperties) => sdks.AsQueryable()); 
+1

To uratowało mój dzień) Miałem dokładnie ten sam problem w dokładnie tej samej metodzie, twoja propozycja działa! –

+0

Dziękujemy! uratowałeś mnie szturchając o – trailmax

+0

Awesome! Pracował. Czy istnieje wyjaśnienie, jak to działa (co tak naprawdę robi)? – Marcel

7

Innym rozwiązaniem dla rozwiązania tego problemu jest użycie: .AsQueryable() zamiast .AsQueryable.

0

Dla innych osób szukających odpowiedzi na to rozwiązanie dla mnie było dodanie tej samej liczby parametrów w Setup, jak w wyrażeniu w Returns.

Na przykład:

Nie działa z innym argumentem liczyć

mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>())) 
       .Returns((string s) => s.ToLower()); 

Praca z taką samą ilością args w ekspresji w Returns jak w Setup

mock.Setup(x => x.DoSomething(It.IsAny<string>())) 
       .Returns((string s1, string s2) => s1.ToLower()); 
Powiązane problemy