views:

1475

answers:

1

Not sure how I can fix this, trying to do a unit test on the method "GetByTitle"

Here are my definitions:

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:

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




}

Running the test gives me the error:

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

Update

My [Setup] looks like:

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


     _articleManager = new ArticleManager(_mockDaoFactory.Object);    
}
+10  A: 

In order to control the behavior of a mock object (in Moq, at least), you either need to mock an interface, or make sure that the behavior you're trying to control is marked virtual. In your comment, I understand it so that the instantiating of _mockArticleDao is done something like this:

_mockArticleDao = new Mock<ArticleDAO>();

If you want to keep it as so, you need to mark the GetArticle method virtual:

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

Otherwise (and this is what I recommend), mock the interface instead.

_mockArticleDao = new Mock<IArticleDAO>();
Tomas Lycken
but since the ArticleDAO inherits from Generic.... , if I mock the interface the methods in the GenericNhibern. will not be made available?
mrblah
because the call to GetArticleDAO from the factory returns ArticleDAO not IArticleDAO, b/c articleDAO also binds to an abstract class that has nhibernate stuff in it.
mrblah
If you can't mock the interface, then you might be testing the wrong thing... but still, marking the method virtual will solve the problem.
Tomas Lycken