2009-12-08 29 views
5

我想爲我的Linq To SQL代碼設置單元測試。我的代碼使用System.Data.Linq.Table類(由設計者生成)。Typemock是唯一可以模擬Linq To SQL Table類的框架嗎?

因爲這個類是密封的,構造函數是內部的,它完全是impervious to unit testing frameworks like Rhino Mocks。 (除非你想改變你的代碼來使用存儲庫模式,我寧願不使用它。)

Typemock可以(一些如何)模擬這個類。 (以here爲例。)

但是,Typemock也是800美元的許可證。我看不到我的僱主很快就會出現這種情況。

所以這裏是問題。有沒有其他嘲笑框架不依賴於接口來創建模擬?


編輯:代碼示例,我需要測試:

public class UserDAL : IUserDAL 
{ 
    private IDataClassesDataContext _ctx; 
    public UserDAL() 
    { 
     string env = ConfigurationManager.AppSettings["Environment"]; 
     string connectionString = ConfigurationManager 
            .ConnectionStrings[env].ConnectionString; 
     _ctx = new DataClassesDataContext(connectionString); 
    } 
    public UserDAL(IDataClassesDataContext context) 
    { 
     _ctx = context; 
    } 
    public List<User> GetUsersByOrganization(int organizationId) 
    { 
     IOrderedQueryable<User> vUsers = 
      (from myUsers in _ctx.Users 
      where myUsers.Organization == organizationId 
      orderby myUsers.LastName 
      select myUsers); 
     return vUsers.ToList(); 
    } 
    public bool IsUserInOrganization(User user, int orgainzationID) 
    { 
     // Do some Dal Related logic here. 

     return GetUsersByOrganization(orgainzationID).Contains(user);    
    } 
} 

我已經短路這件事,使之更易於閱讀。這個想法是,我有一些代碼(如IsUserInOrganization調用另一個,做一個LINQ查詢方法(如GetUsersByOrganization)。

我想單元測試IsUserInOrganization方法,不要做,我就需要模擬_ctx.Users 。這是一個表類(被密封並且具有內部的構造函數)

+0

有兩點需要注意: 1.測試IsUserInOrganization通常應該從測試GetUsersByOrganization除了在集成測試分開;他們不會做同樣的事情。 GetUsersByOrganization的測試通常會包含IsUserInOrganization中特定用法的覆蓋範圍。如果在IsUserInOrganization方法中沒有額外的代碼,則沒有理由測試該方法,因爲無論如何,測試GetUsersByOrganization應覆蓋相關的情況。 基本上,在這種情況下,你想測試錯誤的東西,在我看來。 – 2009-12-08 18:12:13

+0

一個叫另一個。無需將它卸載到不同的課程中,如何在不調用其他課程的情況下測試它? – Vaccano 2009-12-08 18:13:44

+0

你不能。事實上,這是一種代碼味道。 – 2009-12-08 18:24:10

回答

4

退房Microsoft Stubs擁有的簡單的前提:

更換任何.NET方法與自己的 委託!

並更詳細地描述了它的功能(重點是我的)。

存根是完全基於代表用於 測試存根和彎路在.NET是 輕質框架,生成的類型 安全,refactorable和源代碼 。存根設計提供了 對Pex白色的最小開銷 框分析,支持代碼 合同運行時寫入程序和 鼓勵編程模型 而不是記錄/重放測試。 存根可用於任何.NET方法,包括密封類型的非虛擬/靜態方法 。關於代碼

+0

存根已被重命名爲'痣' – Peli 2010-03-21 03:52:50

+0

-1,從嘗試使用痣來做到這一點,我發現它是非常困難的。在TypeMock中它是這樣的:Mock mockDC = MockManager.Mock(typeof(CustomerServicesDataContext)); mockDC.ExpectGetAlways(「Categories」,mockCats); --- 2行代碼(加上構建mockCats對象)! – jcollum 2010-12-20 22:49:35

+1

@jcollum,這是一個非常簡單的參數,用於回答一個答案,但是您可以隨心所欲。然而,在附註中,我從來沒有說過它比TypeMock更容易,這回答了OP要求的內容。如果你有TypeMock許可證,那麼對你有好處......使用它。但不要以爲每個人都有。 – 2010-12-21 10:14:47

2

有兩種標準單元測試在這種情況下接近:

1)不要測試平臺 - 如果相關性是在框架類,你不寫測試在那裏交互驗證。這通常意味着您在測試時替換依賴項,但在您的情況下,它可能意味着您要注入表本身。

2)包裹平臺 - 如果你需要測試的東西,與平臺互動,然後編寫相關組件

了一層包裝還有集成與驗收測試的考慮。對於這兩種情況,您通常會簡單地接受依賴項,因爲它存在於您的應用程序中。

你究竟在考慮什麼,你需要直接模擬/替換這個類呢?

編輯:

看來,如果你正在尋找避免重寫代碼更加可測試。這就是TypeMock擅長的地方,也是一些測試擁護者認爲TypeMock會導致問題的原因。但是,如果您絕對拒絕重構代碼的可測試性,那麼這是您工作的正確工具。

編輯#2:

也許我過於迷戀這個,但讓我們考慮一個更容易測試模式:

Organization() 
{ 
    HasUser(name) 
} 

OrganizationDAL 
{ 
    Organization LoadOrganization(id) 
} 

OrganizationServiceFacade 
{ 
    IsUserInOrganization(name, orgid) 
    { 
     return OrgDAL.LoadOrganization(id).HasUser(name) 
    } 
} 

組織自然包含測試用戶不再需要爲平臺獨立的,你應該能夠注入數據源。OrganizationDAL僅負責加載組織,而不是返回有關組織的信息(儘管有必要的話可以將查詢放入此層)。 OrganizationServiceFacade僅負責提供組合服務,既要滿足可模擬性,又要避免額外的單元測試(它是一個集成或可能甚至是一個接受目標),因爲它是一個包裝類。根據您構建組織的方式,您可以注入數據而不依賴於數據如何工作的特定概念。

+0

我投票贊成包裝平臺。您不應對測試您的框架正常工作負責。 – 2009-12-08 17:24:47

+0

在問題中添加了更多內容以顯示我關心的測試。 – Vaccano 2009-12-08 17:56:44

相關問題