2011-11-20 44 views
0

我有一個模型,其中包含一個鏈接到SQL查詢,從我的數據庫中獲取信息,然後我把它在我的視圖中循環出來,它呈現與表中的結果集的部分。非常簡單直接。雖然我真的很難在TDD上做得更好,但我想對此進行測試。請記住,如果你發現一個測試,迫使我重新思考我的設計,那很好。測試應該可以幫助您發現設計模式中的缺陷。我將發佈一些代碼我下面的模型,和部分:linq到sql結果集在視圖上的nunit測試

public class ApplicationModel 
{ 
    public static DeployEntities DeployEntities = new DeployEntities(); 

    public static IQueryable<Application> GetApplicationList() 
    { 
     var applications = DeployEntities.Applications.OrderByDescending(a => a.Name); 
     return applications.AsQueryable<Application>().Distinct(); 
    } 
} 


@{ 
    foreach (var a in Deploy.Models.ApplicationModel.GetApplicationList()) 
        {  
       <tr id="applications"> 
        <td class="row-heading"> 
         <p class="pseudo">@a.Name</p> 
        </td> 
        <td class="insert-col"> 
        <div class="number-insert"> 
         <p>Deploy Number</p> 
         <span class="count"></span> 
        </div> 

所以,我怎麼能去與這個測試的任何想法。正如您從Razor語法和Entity Framework中看到的那樣,我正在使用MVC3。提前致謝。

回答

3

雖然我真的很努力做好TDD的工作,但我想爲此做一個測試。

下面的行廢墟模型:

public static DeployEntities DeployEntities = new DeployEntities(); 

靜態硬編碼依賴性=>不可能單元隔離測試模型。

爲了削弱你的DAL和模型之間的耦合,你可以引入一個抽象:

public interface IApplicationRepository 
{ 
    IQueryable<Application> GetApplications(); 
} 

,然後你的模型可以使用構造器注入:在單元測試

public class ApplicationModel 
{ 
    private readonly IApplicationRepository _repository; 
    public ApplicationModel(IApplicationRepository repository) 
    { 
     _repository = repository; 
    } 

    public static IQueryable<Application> GetApplicationList() 
    { 
     var applications = _repository.OrderByDescending(a => a.Name); 
     return applications.AsQueryable<Application>().Distinct(); 
    } 
} 

現在你可以使用模擬框架(如Rhino Mocks或Moq)來模擬此存儲庫並設置期望值,並且可以單獨測試GetApplicationList方法。

+0

謝謝你。我正在考慮引入一個接口,儘管我想在應用程序繼續使用時逐步改進它。儘管爲了測試它很容易,你是對的。謝謝。 – Tim

+0

但是,我仍然需要初始化實體連接字符串的對象才能夠查詢數據庫。在你提交的代碼中沒有提供。你會怎麼做呢?你會在界面或模型中做到嗎? – Tim

+0

@ user1056170,你可以爲此使用依賴注入框架。 Ninject就是一個例子。 –

0

在模型視圖控制器模式中,獲得單元測試的部分是控制器。所以在你的情況下,你會爲​​你的控制器功能編寫一個單元測試。

應該檢查它是否得到所有返回的應用程序,按名稱排序,沒有重複。

您的視圖如何渲染此信息不在本單元測試的範圍內。

當然,你可以看看編碼的UI測試。這些測試檢查您的用戶界面是否顯示正確的數據並正確響應用戶事件。