2013-04-06 35 views
2

我有大量的類都使用相同的接口。這是第一次這個代碼將有單元測試,所以我試圖想出最好的方式來生成所有這些測試,或者至少是類的結構。T4模板 - 從實現接口的類生成單元測試類

我知道T4模板用於基於模型生成多個文件。有沒有一種方法可以在T4模板中指定,我希望它能夠查看所有實現接口的類併爲每個接口生成一個單元測試類。或者,如果更容易,所有的類都在同一個文件夾中,所以如果我可以將它指向該文件夾,它可能會很好。

一旦完成,我可以用specfics填寫每個單元測試類的細節。我顯然必須刪除T4文件,以免覆蓋已添加到類中的代碼,也許有辦法做到這一點?

回答

3

看看一個這個博客帖子:

http://t4-editor.tangible-engineering.com/blog/how-to-generate-multiple-output-files-from-a-single-t4-template.html

它應使您能夠生成一個文件.TT多個輸出。我以幾乎相同的方式使用它,基於xml文件生成一大類方法(3000行),然後生成另一個文件,其中包含這些方法的單元測試。具有諷刺意味的是,單元測試指出了我的大型生成類中的幾個錯誤,即使單元測試也生成了。

+1

該鏈接不再有效。 – 2017-01-24 09:33:33

+1

@AntonínProcházka,thx,FTFY – 2017-01-24 10:32:58

0

T4模板始終只生成一個輸出項,可以是設計時模板的一個輸出文件或運行模板的一個字符串。因此模板本身將無法生成多個文件。儘管如此,使用一些代碼,您可以多次使用單個運行時模板,以便根據需要創建多個輸出項。

我建議創建一個簡單的實用程序,與主項目分開,它將包含T4運行時模板和代碼,例如,將檢查給定的程序集或一堆給定的源文件並生成相應的測試框架使用T4運行時模板並將其保存到每個感興趣的類的文件中。我想這取決於有問題的類的數量,如果值得花一點時間來創建這樣的工具。

如果不夠清楚,請告訴我,我會盡量提供一個例子。

+1

嗨,我不認爲這是正確的。如果你看看EF context.tt文件,你會看到它通過 - fileManager.StartNewFile(entity.Name +「.cs」)生成許多單獨的文件; 。我感謝你的意見,但我想我只需要通過上下文文件並從中學習。 – user1266921 2013-04-13 09:14:02

+0

@ user1266921您提到的是通過「EntityFrameworkTemplateFileManager」類實現的EF特定功能,如http://msdn.microsoft.com/en-us/library/ff477603.aspx中所述。所以如果你不介意EF參考,使用這也可能是一個解決方案。或者你當然可以自己實現一個類似的東西或者使用其他的實現。 T4的開箱即用行爲是一個輸出文件,其名稱與模板名稱相同,並由<#@ output #>指令指定,並且我建議的方法是恕我直言,這是實現您所需的最簡單方法。 – famousgarkin 2013-04-13 15:20:10

0

我正在做一個類似的新項目,我想用T4模板來生成一些代碼,這些代碼與所有從特定類繼承的類有關。 (基本上寫一個工廠生成器類來創建每個派生類的新實例,只給出一個包含類名稱的字符串,並且還可以在運行時收集每個類中公共屬性的列表,這樣,其他開發人員就可以只需將新類添加到項目中,而不必擔心將其綁定到我們的框架中。)

我還將源類保留在公共子文件夾中。

雖然我只是開始設計模板是如何工作的,該模板將代碼運行之前被編譯,所以我的過程將是:

  1. 對於在子文件夾中的每個源代碼文件:
    1. 將文件加載到內存中。
    2. 使用正則表達式驗證文件中的類是否從所需的基類繼承。
    3. 使用正則表達式來提取我需要的數據。
  2. 編寫使用我收集的數據(類名,公共屬性名稱)

這是一些地方Roslyn可以以提取類和屬性分析代碼是有用的輸出類名字,但我現在不會太花哨。我的方法將我們限制爲每個文件一個類,並且只能使用我們正在編寫的一種語言,但這是我們可以忍受的配置慣例。

您可能會發現this MSDN article有用,還有Oleg Sych's blog and toolkit。奧列格的T4工具箱包含一個模板,用於從單個T4模板生成多個輸出文件。

相關問題