簡體   English   中英

構造函數是否注入TDD?

[英]To Constructor Inject Or Not With TDD?

我有一個方法,我正在嘗試單元測試使用查詢對象,我想Stub這個查詢對象為我的單元測試。 此查詢對象確實具有依賴項(UnitOfWork)。 我正在使用IOC / DI容器在應用程序中實例化我的對象。 但是我不想在TDD時使用容器。 我看到它的方式是我有兩個選擇:

  1. 將查詢對象作為字段或屬性添加到方法的類中,並將其作為ctor參數注入。 然而,這感覺不對,因為這1個方法是使用它的唯一方法,如果我也曾經有補充的是沒有使用該查詢對象的第二方法,對象將不得不重新實例或每個復位后采用。
  2. 將查詢對象添加到方法的簽名。 聞?

還有其他選擇或圖案嗎? 或者我接近錯了?

這是一些偽代碼:

選項1

public class OrdersController
{
            public OrdersController(IOrderQuery query)
            {
                this.query = query;
            }

            private readonly IOrderQuery query;

            public Queryable<Order> OrdersWaiting()
            {
                var results = query(...);
                ...
            }
}

選項#2

public class OrdersController
{
            public Queryable<Order> OrdersWaiting(IOrderQuery query)
            {
                var results = query(...);
                ...
            }
}

和我的查詢對象

public class OrderQuery : IOrderQuery
{
            public OrderQuery(IUnitOfWork unitOfWork)
            {
                ...
            }
}

絕對優先選擇選項1而不是選項2.看起來IOC容器有責任實例化/了解查詢對象。 調用者不必知道OrdersWaiting如何/在OrdersWaiting獲取其數據的詳細信息。

使用選項2,調用者不僅需要獲取控制器的實例,還需要獲取查詢對象的實例,這可能超出調用者的可見性。

如果我必須添加第二個使用此查詢對象的方法,則必須在每次使用后重新實例化或重置該對象。

如果這是阻止您在此處使用構造函數注入的原因,請考慮注入IOrderQueryFactory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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