簡體   English   中英

在單元測試中模擬Automapper是一個好習慣嗎?

[英]Is it a good practice to mock Automapper in unit tests?

有這個代碼庫,我們使用automapper並有2層, DomainService 每個都有其數據表示對象, DomainItemServiceItem 服務從域獲取數據,使用構造函數注入的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM