Ich bin mir nicht sicher, wie ich das beheben kann, indem ich versuche, einen Komponententest für die Methode "GetByTitle" durchzuführen.
Hier sind meine Definitionen:
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);
}
Gerätetest:
[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);
}
Das Ausführen des Tests gibt mir den Fehler:
System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
Aktualisieren
Mein [Setup]
sieht aus wie:
[Setup]
public void SetUp()
{
_mockDaoFactory = new Mock<IDaoFactory>();
_mockArticleDao = new Mock<ArticleDao>();
_articleManager = new ArticleManager(_mockDaoFactory.Object);
}
_mockDaoFactory
und_mockArticleDao
irgendwo? Verspotten Sie die Klasse oder die SchnittstelleGetByTitle
Methode markierenvirtual
.Antworten:
Um das Verhalten eines Scheinobjekts zu steuern (zumindest in Moq), müssen Sie entweder eine Schnittstelle verspotten oder sicherstellen, dass das Verhalten, das Sie steuern möchten, als virtuell markiert ist. In Ihrem Kommentar verstehe ich es so, dass das Instanziieren von ungefähr
_mockArticleDao
so erfolgt:Wenn Sie es so lassen möchten, müssen Sie die
GetArticle
Methode markierenvirtual
:Andernfalls (und das empfehle ich) verspotten Sie stattdessen die Benutzeroberfläche.
quelle