2009-12-25 2 views
99

Non sono sicuro di come posso risolvere questo problema, cercando di fare un test di unità sul metodo "GetByTitle"Moq: l'installazione non valido su un membro non-override: x => x.GetByTitle ("asdf")

Qui sono le mie definizioni: prova

public class ArticleDAO : GenericNHibernateDAO(IArticle, int>, IArticleDAO 
{ 
    public IArticle GetByTitle(string title) 
    { 
     IQuery query = Session.CreateQuery("...") 
     return query.UniqueResult<IArticle>(); 
    } 
} 

public interface IArticleDAO 
{ 
    IArticle GetByTitle(string title); 
} 

unità:

[Test] 
public void can_load_by_title() 
{ 
    _mockDaoFactory.Setup(x => x.GetArticleDao()) 
           .Returns(_mockArticleDao.Object); 
    _mockArticleDao.Setup(x => x.GetByTitle("some title")) 
           .Returns(article1.Object); 

    _articleManager.LoadArticle("some title"); 

    Assert.IsNotNull(_articleManager.Article); 
} 

Esecuzione del test mi dà l'errore:

System.ArgumentException: Invalid setup on a non-overridable member: 
x => x.GetByTitle("some title") 

Aggiornamento

mio [Setup] assomiglia:

[Setup] 
public void SetUp() 
{ 
    _mockDaoFactory = new Mock<IDaoFactory>(); 
    _mockArticleDao = new Mock<ArticleDao>(); 

    _articleManager = new ArticleManager(_mockDaoFactory.Object);  
} 
+2

fare si crea un'istanza di '' _mockDaoFactory' e _mockArticleDao' da qualche parte? Prendi in giro la classe o l'interfaccia –

+0

Sì, ho deriso il daofactory e il mockarticle nel [Setup] utilizzando l'interfaccia. il DAO è stato fatto usando la classe. – mrblah

+0

@tomas Ho aggiornato la mia domanda con il codice di configurazione. – mrblah

risposta

138

Al fine di controllare il comportamento di un oggetto fittizio (in Moq, almeno), vi sia bisogno per deridere un'interfaccia, o fare sicuro che il comportamento che stai cercando di controllare è contrassegnato come virtuale. Nel tuo commento, ho capito in modo che il creare un'istanza di _mockArticleDao è fatto qualcosa di simile:

_mockArticleDao = new Mock<ArticleDAO>(); 

Se si vuole mantenere il più così, è necessario contrassegnare il GetArticle metodo virtual:

public class ArticleDAO : GenericNHibernateDAO(IArticle, int>, IArticleDAO 
{ 
    public virtual IArticle GetByTitle(string title) 
    { 
     // ... 
    } 
} 

Altrimenti (e questo è quello che raccomando), mock invece l'interfaccia.

_mockArticleDao = new Mock<IArticleDAO>(); 
+0

ma dal momento che l'articoloDAO eredita da Generic ...., se faccio scherno dell'interfaccia i metodi in GenericNhibern . non sarà reso disponibile? – mrblah

+0

perché la chiamata a GetArticleDAO dalla fabbrica restituisce ArticleDAO not IArticleDAO, b/c articleDAO si collega anche a una classe astratta che contiene elementi di tipo nhibernate. – mrblah

+2

Se non riesci a simulare l'interfaccia, allora potresti provare la cosa sbagliata ... ma comunque, contrassegnando il metodo virtuale si risolverà il problema. –