簡體   English   中英

ASP.NET MVC - 如何在存儲庫模式中單元測試邊界?

[英]ASP.NET MVC - How to Unit Test boundaries in the Repository pattern?

給定基本存儲庫接口:

public interface IPersonRepository
{
    void AddPerson(Person person);
    List<Person> GetAllPeople();
}

基本實現:

public class PersonRepository: IPersonRepository
{
    public void AddPerson(Person person) 
    {
        ObjectContext.AddObject(person);
    }

    public List<Person> GetAllPeople()
    {
        return ObjectSet.AsQueryable().ToList();
    }
}

你怎么能以有意義的方式對它進行單元測試? 由於它跨越邊界並從數據庫進行物理更新和讀取,這不是單元測試,而是集成測試。

或者首先想要對其進行單元測試是不對的? 我應該只對存儲庫進行集成測試嗎?

我一直在谷歌上搜索主題,博客經常說要創建一個實現IRepository的存根:

public class PersonRepositoryTestStub: IPersonRepository
{
    private List<Person> people = new List<Person>();
    public void AddPerson(Person person) 
    {
        people.Add(person);
    }

    public List<Person> GetAllPeople()
    {
        return people;
    }
}

但是沒有單元測試PersonRepository,它測試PersonRepositoryTestStub的實現(不是很有幫助)。

在這個特定的情況下,我認為你不需要對你的存儲庫類進行單元測試,因為實現只是調用ObjectContext對象,所以它就像測試你沒有構建的東西(這不是主意) 。 如果您沒有任何復雜的邏輯,我的建議是不要浪費時間對該類進行單元測試。 你對PersonRepositoryTestStub的看法是一個虛假的存儲庫實現,用於測試DAL之上的層。

我遇到了同樣的問題。 我針對我的存儲庫接口的實現編寫了一系列單元測試,這是一個虛假的存儲庫。 完成后不久,我意識到我編寫了單元測試來測試虛擬存儲庫,我編寫了虛擬存儲庫,只是為了支持單元測試。 這似乎是一大堆無用的代碼。

我得出的結論是,我不需要單元測試,但虛假的存儲庫實現是好的,因為我可以使用它作為存儲庫我的服務(因此我的控制器)使用,以便對那些進行單元測試是可預測的(感謝預定義的假存儲庫)。

因此,我決定將單元測試與假存儲庫放在一起,因為它們有助於測試我的假存儲庫,以便我可以放心,我的應用程序的更高級別使用完全測試的假貨。

換句話說,虛擬存儲庫和針對虛擬存儲庫的單元測試是針對更高級別的應用程序的“支持演員”以及針對更高級別的應用程序的單元測試。

希望有所幫助。

我認為這種類型的測試有意義的時候是你的存儲庫接口是通用的。 例如

public interface IEntity
{
    int Id { get; set; }
}

public interface IRepository<TEntity>
    where TEntity : IEntity
{
    void Add(TEntity entity);
    List<TEntity> GetAll();
}

如果您有該接口的多個實現,那么還可以編寫一個針對該接口進行測試的通用測試夾具,允許您使用單個測試夾具測試多個存儲庫實現。 這種方法不區分單元測試和集成測試,因為它不知道實現是什么。

如果這類事情讓您感興趣,請告訴我,我可以發布一個完整的例子。

我將測試直接依賴於DAL實現的業務邏輯層(強烈引用DAL精確實現)或間接(通過接口從DAL抽象)。

我不是非常喜歡使用存根實現的測試,只是將數據庫調用包裝到未注釋的事務中(即使拋出異常,也會在測試結束時回滾所有數據更改)。

暫無
暫無

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

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