2009-08-08 6 views
0

Also, ich benutze Moq zum Testen, aber ich stieß auf ein Problem, das mich davon abhält, richtig zu verspotten, zumindest denke ich. Das ist meine Repository-Klasse:MOQ-Problem - Mocked-Klasse gibt falsche Daten zurück

public interface IAccountsRepository 
    { 
     IQueryable<Account> Accounts { get; } 
     IQueryable<Account> AccountsPaged(int pageSize, int selectedPage); 
    } 

Dies ist eine der Implementierungen ist (fake):

public class FakeAccountsRepository : IAccountsRepository 
    { 
     private static readonly IQueryable<Account> FakeAccounts = new List<Account> { 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"} 
     }.AsQueryable(); 

     public IQueryable<Account> Accounts 
     { 
      get { return FakeAccounts; } 
     } 

     public IQueryable<Account> AccountsPaged(int pageSize, int selectedPage) 
     { 
      return FakeAccounts.Skip((selectedPage - 1)*pageSize).Take(pageSize).AsQueryable(); 
     } 
    } 

Dies ist eine Controller-Definition ist, die perfekt mit realer Seite und gefälschten oder SQL-Daten (IOK) funktioniert in einer echten Web-Seite:

public class AccountsController : Controller 
    { 
     private IAccountsRepository _accountsRepository; 
     public int PageSize = 3; 

     public AccountsController(IAccountsRepository accountsRepository) 
     { 
      this._accountsRepository = accountsRepository; 
     } 

     public ViewResult List(int selectedPage) 
     { 
       return View(_accountsRepository.AccountsPaged(PageSize, selectedPage).ToList()); 
     } 
    } 

Dies ist eine moq Methode:

es funktioniert gut mit dieser Implementierung der Liste Paginierung:

public ViewResult List(int selectedPage) 
     { 
      return View(_accountsRepository.Accounts.Skip((selectedPage - 1) * PageSize).Take(PageSize).ToList()); 

     } 

aber es funktioniert nicht, wenn dies mit:

public ViewResult List(int selectedPage) 
     { 
      return View(_accountsRepository.AccountsPaged(PageSize, selectedPage).ToList()); 
     } 

Ohne Test verändert und nur Liste Implementierung zu ändern (tun Paginierung nur auf .Accounts) es funktioniert alles, aber wenn ich versuche, die Methode "AccountsPaged" zu verwenden, schlägt es fehl, keine Elemente zurückzugeben. In der Praxis, auf einer Webseite, funktioniert es in beide Richtungen.

Bitte beraten, danke.

EDIT: Wenn ich dies tun:

mockProductsRepos.Setup(x => x.AccountsPaged(Moq.It.IsAny<int>(), Moq.It.IsAny<int>())).Returns(accs.AsQueryable()); 

ich 5 Artikel

Antwort

2

Sie statt 2. zurückgegeben hat nicht Setup AccountsPaged Methode in Ihrem Mock

EDIT: Jetzt, Sie haben AccountsPaged eingerichtet, Sie haben es nicht richtig eingerichtet. Hier, wie man es richtig Setup:

mockProductsRepos 
    .Setup(x => x.AccountsPaged(Moq.It.IsAny<int>(), Moq.It.IsAny<int>())) 
    .Returns((int pageSize, int selectedPage) => accs.Skip((selectedPage-1)*pageSize).Take(pageSize).AsQueryable()); 
+0

Ich habe es jetzt eingerichtet, wie ich dem Beitrag oben hinzugefügt habe, aber es gibt mir 5 Elemente anstelle von 2 - was erwartet würde, wenn .List() Anruf ordnungsgemäß funktioniert. Ich weiß nicht, wie es sein könnte und warum gibt es wieder volle Mitglieder? Gibt es eine Möglichkeit, das Moq-Setup Schritt für Schritt zu debuggen? – BuzzBubba

1

Ich habe nicht in jeder Tiefe durch den Code zu analysieren, sondern eine allgemeine Faustregel - Wenn im Zweifel in Bezug auf Mock Korrektheit, verwenden strenge spöttischen, alle fehlenden Erwartungen auszuspülen :

var mock = neuer Mock (MockBehavior.Strict);

auf diese Weise erhalten Sie explizite Hinweise auf unerwartete Aufrufe des SUT, die Sie vergessen haben zu spotten.

Verwandte Themen