Nie wiem, jak mogę to naprawić, próbuję wykonać test jednostkowy metody „GetByTitle”
Oto moje definicje:
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);
}
test jednostkowy:
[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);
}
Uruchomienie testu daje mi błąd:
System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
Aktualizacja
Mój [Setup]
wygląd wygląda tak:
[Setup]
public void SetUp()
{
_mockDaoFactory = new Mock<IDaoFactory>();
_mockArticleDao = new Mock<ArticleDao>();
_articleManager = new ArticleManager(_mockDaoFactory.Object);
}
_mockDaoFactory
i_mockArticleDao
gdzieś?GetByTitle
metodęvirtual
.Odpowiedzi:
Aby kontrolować zachowanie pozorowanego obiektu (przynajmniej w Moq), musisz albo mockować interfejs, albo upewnić się, że zachowanie, które próbujesz kontrolować, jest oznaczone jako wirtualne. W twoim komentarzu rozumiem to, więc tworzenie instancji
_mockArticleDao
odbywa się mniej więcej tak :Jeśli chcesz go tak zachować, musisz zaznaczyć
GetArticle
metodęvirtual
:W przeciwnym razie (i to właśnie zalecam) zamiast tego zamontuj interfejs.
źródło