![](/img/trans.png)
[英]How to mock Automapper ProjectTo<> method in Unit Tests?
[英]Is it a good practice to mock Automapper in unit tests?
有這個代碼庫,我們使用automapper並有2層, Domain
和Service
。 每個都有其數據表示對象, DomainItem
和ServiceItem
。 服務從域獲取數據,使用構造函數注入的automapper實例進行映射
class Service
{
public ServiceItem Get(int id)
{
var domainItem = this.domain.Get(id);
return this.mapper.Map<DomainItem, ServiceItem>(domainItem);
}
}
假設最佳實踐,因此mapper沒有副作用,也沒有外部依賴。 您將編寫一個靜態函數,在幾秒鍾內將一個對象轉換為另一個對象,只是映射字段。
考慮到這一點,在這樣的單元測試中模擬映射器是一個好習慣嗎?
[TestClass]
class UnitTests
{
[TestMethod]
public void Test()
{
var expected = new ServiceItem();
var mockDomain = new Mock<IDomain>();
// ... setup
var mockMapper = new Mock<IMapper>();
mockMapper.Setup(x => x.Map<DomainItem, ServiceItem>(It.IsAny<DomainItem>()))
.Returns(expected);
var service = new Service(mockDomain.Object, mockMapper.Object);
var result = service.Get(0);
Assert.AreEqual(expected, result);
}
}
對我來說,似乎這樣的單元測試並沒有真正帶來任何價值,因為它只是有效地測試了模擬,所以我要么根本不要寫它或者我要使用實際的映射器,而不是模擬的映射器。 我是對的還是我忽略了什么?
我認為這里的問題是測試編寫得非常糟糕,因為它實際上試圖實現的是測試Service.Get()
。
我寫這個測試的方式如下:
[TestMethod]
public void Test()
{
var expected = new ServiceItem();
var mockDomain = new Mock<IDomain>();
var expectedDomainReturn = new DomainItem(0); //Illustrative purposes only
mockDomain.Setup(x => x.DomainCall(0)).Returns(expectedDomainReturn); //Illustrative purposes only
var mockMapper = new Mock<IMapper>();
mockMapper.Setup(x => x.Map<DomainItem, ServiceItem>(It.IsAny<DomainItem>()))
.Returns(expected);
var service = new Service(mockDomain.Object, mockMapper.Object);
var result = service.Get(0);
mockDomain.Verify(x => x.DomainCall(0), Times.Once);
mockMapper.Verify(x => x.Map<DomainItem, ServiceItem>(expectedDomainReturn), Times.Once);
}
此測試不是沒有真正檢查service.Get()
的功能,而是根據響應檢查傳遞的參數對於各個依賴性調用是否正確。 因此,您不會測試AutoMapper
本身,也不應該這樣做。
檢查result
基本沒用,但會獲得代碼覆蓋率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.