![](/img/trans.png)
[英]How to add unit tests using Moq and xUnit in this specific scenario?
[英]Problem using Moq in unit tests
我一直在探索在單元測試中使用模擬對象,並一直在嘗試.NET的Moq框架。 我在嘗試測試從數據庫返回域對象的服務層方法時遇到一些問題。
這是我的設置:
[SetUp]
public void DoSetupTasks()
{
mockDao = new Mock<IHibernateDao>();
_hibernateService = new HibernateService(mockDao.Object);
mockDomainObject = new Mock<DomainBase>();
dmBase = new DomainBase()
{
Id = 5
};
}
這是我遇到問題的單元測試。 方法FindById()
返回基於給定ID和Type的DomainBase對象。
[Test]
public void TestFindById()
{
mockDomainObject.Setup(dmb => dmb.Id.Equals(It.IsAny<long>())).Returns(true);
mockDao.Setup(dao => dao.FindById(
It.IsAny<long>(),
It.IsAny<Type>()
)).Returns(mockDomainObject.Object);
_hibernateService.FindById(dmb.Id, typeof(DomainBase));
mockDomainObject.VerifySet(dmb => dmb.Id = dmBase.Id);
}
當我運行單元測試時,它將引發以下異常:
Exception: Invalid setup on a non-virtual (overridable in VB) member: dmb => dmb.Id.Equals(It.IsAny<Int64>())
我承認,我對框架不熟悉。 我一直在嘗試遵循它的一些教程,但是我一直無法弄清楚它。
嘗試更多類似這樣的方法:
[Test]
public void TestFindById() {
const int TEST_ID = 5;
// Configure your mock DAO to return a real DomainBase
// when FindById is called.
mockDao
.Setup(dao => dao.FindById(TEST_ID, It.IsAny<Type>())
.Returns(new DomainBase() { Id = TEST_ID });
var domainObject = _hibernateService.FindById(TEST_ID , typeof(DomainBase));
// Make sure the returned object is a DomainBase with id == TEST_ID
Assert.IsEqual(TEST_ID , domainObject.Id);
Assert.IsInstanceOf<DomainBase>(domainObject);
// and verify that your mock DAO was called with the same argument passed to
// your NHibernate service wrapper:
mockDao.VerifyAll();
}
您不需要模擬域對象-通常最好模擬數據層和服務,然后在被測邏輯代碼和模擬服務層之間傳遞真實的域對象(包含樣本/測試數據)。
編輯:要測試保存和刪除方法,您需要做這樣的事情。 請注意,當調用模擬方法時,我們如何使用Moq庫的Callback()方法運行一些代碼,並且在此回調中,我們斷言傳遞給我們方法的對象就是我們期望的對象:
[Test]
public void TestSaveDomainBase() {
const int OBJECT_ID = 5;
mockDao
.Setup(dao => dao.Save(It.IsAny<DomainBase>()))
.Callback((DomainBase d) => {
// Make sure the object passed to Delete() was the correct one
Assert.AreEqual(OBJECT_ID, d.ID);
});
var objectToSave = new DomainObject() { Id = OBJECT_ID };
_hibernateService.Save(objectToDelete);
mockDao.VerifyAll();
}
[Test]
public void TestDeleteDomainBase() {
const int OBJECT_ID_TO_DELETE = 5;
mockDao
.Setup(dao => dao.Delete(It.IsAny<DomainBase>()))
.Callback((DomainBase d) => {
// Make sure the object passed to Delete() was the correct one
Assert.AreEqual(OBJECT_ID_TO_DELETE, d.ID);
});
var objectToDelete = new DomainObject() { Id = OBJECT_ID_TO_DELETE };
_hibernateService.Delete(objectToDelete);
mockDao.VerifyAll();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.