10

我對EF很新,我想知道用SQL Server數據庫創建EF的最佳方法。之後,我想測試CRUD操作。 EF是以TDD方式實現的,我對這些存儲庫模式,模擬上下文,假模式等感到困惑。單元測試和實體框架

EF中的CRUD操作,什麼東西都會被測試? (DbContext,SaveChanges() ...是否需要測試?)

那麼任何想法如何使用基於實體框架的組件進行單元測試? (我正在檢查所有這些在Visual Studio 2012中,ASP.NET MVC4)

+2

僅供參考:這些通常被稱爲集成測試。如果他們是單元測試..你會每隔30秒打一次「運行測試..」(就像你應該在TDD中一樣),並且每次測試的數據庫往返將使你的測試運行幾分鐘/小時。集成與其他系統實際集成的測試在預發佈時運行。 –

+0

@SimonWhitehead:那麼爲什麼我們使用存儲庫模式,是否需要,以及混淆和僞裝之間的區別是什麼 – neel

+0

*之後,我想測試CRUD操作*您想測試與CRUD操作相關的邏輯,或者要測試實體框架? –

回答

5

要測試EF功能,我建議對已知數據編寫集成測試。 一種常用方法是作爲測試爲前提,以你的你的選擇基於功能測試的一部分,以建立數據:

例:

  1. 插入已知數據

  2. 運行選擇功能與已知數據

  3. 斷言導致

以上步驟將測試您的查詢和EF綁定/模型。

作用於從EF返回的數據的業務邏輯應該通過嘲諷來抽象EF邏輯。這將使您能夠編寫單元測試,而不用考慮集成點/數據依賴性,只需測試邏輯即可。

+1

只是爲了添加一個可能的點4.將每個測試封裝在最後回滾的事務中 - 這樣在測試運行後讓數據庫保持清潔狀態 –

2

您也可以使用內存數據庫測試您的EF模型。使用Effort作爲單元測試數據庫的Here is an example

+0

鏈接已死 –

5

存儲庫和工作模式單元旨在創建數據訪問層和應用程序業務邏輯層之間的抽象層。實現這些模式可以幫助您將應用程序與數據存儲區中的更改隔離開來,並且可以促進自動化單元測試或測試驅動開發(TDD)。

只要去Here與exsample的解釋。

16

比方說你有2層的解決方案

MyApp.Web

MyApp.Data

在數據層,你會是這樣的:

public class ProductsRepository : IProductsRepository 
{ 
    public List<Product> GetAll() 
    { 
     //EF stuff 
     return _dbcontext.Products; 
    } 
} 

其中IProductsRepository是

public interface IProductsRepository 
{ 
    List<Product> GetAll(); 
} 

在MyApp.Web中,趨勢就是這樣做。

public class ProductsController : Controller 
{ 
    private readonly IProductsRepository _productsRepository; 
    public ProductsController(IProductsRepository productsRepository) 
    { 
     _productsRepository = productsRepository; 
    } 

    public ActionResult Index(int page=1) 
    { 
     var allProducts = _productsRepository.GetAll(); 

     return View(allProducts) 
    } 
} 

誰在運行時放入ProductsRepository到構造?人們使用依賴注入像Ninject這個框架。但爲什麼?因爲這樣一來他們能夠僞造ProductsRepository像這樣

public class FakeProductsRepository : IProductsRepository 
{ 
    public List<Product> GetAll() 
    { 
     return new List<Product> 
      { 
       new Product { Name = "PASTE" } 
       new Product { Name = "BRUSH" } 
      }, 
    } 
} 

然後單位測試控制器這樣

[TestMethod] 
public void IndexGetsAllProducts() 
{ 
     //Arrange 
     var fakeProductRepo = new FakeProductsRepository(); 
     var productsController = new ProductsController(fakeProductRepo); 

     //Act 
     var result = productsController.Index(1) as ViewResult; 

     //Assert 
     var model = result.Model as List<Product>; 
     Assert.AreEqual(2, model.Count); 
} 

基本上你是僞造數據庫所以單元測試快速且獨立於數據庫。有時僞造的人使用嘲諷框架Moq,它基本上做同樣的事情。

如果你想測試ProductsRepository那麼它不再被稱爲單元測試,因爲它取決於外部源。測試你基本上測試Entityframework的人。

結合單元測試,人們使用Specflow等框架進行集成測試。基本上,您可以將Productscontroller與實際的ProductsRepository實例化,並檢查返回的結果。