2013-10-11 21 views
0

使用Microsoft Fakes Framework,我正在進行單元測試。但是我遇到了一個問題。我需要僞造一個dbml DataContext。這是Linq to SQL類。在運行時添加字段 - Microsoft Fakes Framework

我需要做的是僞造類System.Data.Linq.Table類的InsertOnSubmitT0()方法。我想將param對象添加到本地字段,而不是將其寫入數據庫。

我的問題是:如何在運行時在現有類表上添加本地字段傳輸?像這樣的:

using (ShimsContext.Create()) 
      { 
       var shimLinq = new ShimTable<Transport>() 
       { 
        //something like this: 
        //addField("transports", List<Transport>, false); 
        InsertOnSubmitT0 = (transport) => 
        { 
         Transport t = (Transport)transport; 
        } 
       }; 
      } 
+0

你在測試什麼?該值被添加到數據庫? – aL3891

+0

好的。我正在測試一種業務邏輯層的方法,該方法可以爲一個給定的銀行獲取所有的傳輸。測試:是聲明調用的正確的linq。這是我組織中的單元測試示例。所以我想測試一下:這個叫嗎? - >'db.Transports.Where(t => t.Bank.Equals(bankName))。ToList();'而不是'db.Transports.ToList();'? – dpwulp94

+0

我明白了,是否有特殊原因需要將該值存儲在Table對象中? – aL3891

回答

1

一般來說,你不能添加一些東西到現有的類型。 (然而,你可以在運行時創建一個子類型並添加東西)

在你的情況下,雖然我建議只使用你創建墊片時捕獲的常規變量,然後你可以返回該變量作爲你的墊片的一部分在您的descresion

var thelist = new List<Transport>(); //fill out whatever test data you want here, in the case of TransportsGet 
using (ShimsContext.Create()) 
    { 
    var shimLinq = new ShimTable<Transport>() 
    { 
     InsertOnSubmitT0 = (transport) => 
     { 
     Transport t = (Transport)transport; 
     thelist = t.Transports; // assign your outer variable, or do the asserts directly 
     } 
    }; 
    } 
// do assertions on thelist here 

後來讀它在你提到勻場TransportsGet的意見,你可以這樣做同樣的方式,只是在墊片返回thelist。然後你可以在測試結束時在thelist變量上聲明。

但是,如果您想測試.Where語句,該語句不會直接顯示在實際列表中,則必須以其他方式進行測試。你可能有一個thelist與無效的銀行和斷言,代碼不會返回任何例如

+0

我現在已經做了測試,但它會拋出異常,因爲ShimTransportsDataContext仍會嘗試連接到數據庫。我將嘗試僞造所有連接的方法。或者,還有更好的方法? – dpwulp94

+0

你可能不必假裝他們所有的人,只是嘗試和運行,看看一個方法試圖連接,然後假冒該方法,沖洗並重復:) – aL3891

相關問題