2009-12-25 9 views
99

No sabe cómo puedo solucionar este problema, tratando de hacer una prueba de unidad en el método "GetByTitle"Moq: configuración no válida en un miembro no reemplazable: x => x.GetByTitle ("asdf")

Aquí son mis definiciones: prueba

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

unidad:

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

Ejecución de la prueba me da el error:

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

actualización

Mi [Setup] parece:

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

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

¿Instancias '_mockDaoFactory' y' _mockArticleDao' en alguna parte? ¿Se burla de la clase o la interfaz? –

+0

Sí, me burlé de la daofactory y del artículo de simulación Dao en [Configuración] usando la interfaz. el DAO fue hecho usando la clase. – mrblah

+0

@tomas Actualicé mi pregunta con el código de configuración. – mrblah

Respuesta

138

Con el fin de controlar el comportamiento de un objeto de burla (en Moq, por lo menos), o hay que hacer burlarse de una interfaz, o hacer Asegúrese de que el comportamiento que está tratando de controlar esté marcado como virtual. En su comentario, lo entiendo por lo que la creación de instancias de _mockArticleDao se hace algo como esto:

_mockArticleDao = new Mock<ArticleDAO>(); 

Si desea mantenerlo como tal, tiene que marcar el GetArticle método virtual:

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

De lo contrario (y esto es lo que recomiendo), se burlan de la interfaz en su lugar.

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

pero dado que ArticleDAO hereda de Generic ...., si me burlo de la interfaz los métodos en el GenericNhibern . no estará disponible? – mrblah

+0

porque la llamada a GetArticleDAO de fábrica devuelve ArticleDAO no IArticleDAO, b/c articleDAO también se une a una clase abstracta que tiene elementos de nhibernación en ella. – mrblah

+2

Si no puede burlarse de la interfaz, entonces podría estar probando lo incorrecto ... pero aún así, marcar el método virtual resolverá el problema. –

Cuestiones relacionadas