2012-07-02 17 views
5

我有一些功能withing一個腳本文件,setup.fsx 我想考這些。 xUnit和類似需要測試的功能是程序集的一部分。寫作考試在F#

所以我想從setup.fsx重命名我的腳本setup.fs擴展,那麼從另一個腳本文件加載它。但後來我的腳本取決於

#r "System.Xml" 
#r "System.Xml.Linq" 

,我將不得不在調用腳本指定(遠離那些依賴實際出現)

是否有反正基於xUnit的worflow腳本集成測試? 建議爲腳本文件編寫測試的組織是什麼?

(可能是我們需要一個Visual Studio擴展腳本的測試,而不是在組裝..)

回答

2

即使你只需要添加fsx腳本到Visual Studio中,你仍然可以編譯setup.fsx成一個正常的項目連同其他(可能fs)文件,所以你應該能夠保持腳本在Visual Studio中正常的腳本文件,並在同一時間,從項目或從命令行工具,建立你的測試引用它。

我試圖這樣做有以下test.fsx文件:

module Demo 
#r "System.Xml.Linq.dll" 
open System.Xml.Linq 

let test() = 
    let d = XDocument(XElement(XName.Get("foo"))) 
    d.ToString() 

你肯定需要一些module Name聲明開頭(這樣您就可以訪問其他文件中的函數),但除此之外,它可以是任何fsx文件。我使用的其他文件爲test.fs

module Main 
open Demo  
test() |> printfn "%A" 

這僅僅是測試,但在這裏,你可以寫你的單元測試。如果您編譯使用以下命令的文件,你的標準組件,你可以傳遞給的xUnit(注意,編譯器可以選擇從test.fsx#r標籤,我們沒有明確寫入參考):

fsc.exe --target:library test.fsx test.fs 

我認爲,如果你添加一個庫項目,然後手動添加鏈接到文件中使用這樣的事情在fsproj文件(可以在你的解決方案結構指向文件的其他地方),你可以得到在Visual Studio中相同的配置:

<Compile Include="..\Eslewhere\In\Your\Project\Tree\File.fsx"> 
    <Link>File.fsx</Link> 
</Compile> 

注意,當您添加fsx文件使用「添加項目」,它被標記爲「包含」而不是「編譯」,因此它不會被編譯爲項目的一部分。上面應該包括它在項目中,它應該告訴編譯器將它包含在編譯程序集中。

警告:說,我認爲它可能會更好地測試使用標準單元測試編譯dll文件。如果你想測試fsx文件,我只想添加幾行,作爲在最後測試和手動(選擇,Alt + Enter)運行它們。原因是fsx文件應該經常更改,因此測試過於嚴密可能會限制您的靈活性。另一方面,一旦代碼變得更加穩定,將其移動到dll文件是有意義的。

+2

如果你在fsx的頂部寫模塊,你不能在fsi中執行它。添加#if COMPILED 模塊演示 #endif 似乎確定 – nicolas

+0

確定您有權訪問Demo命名空間,當它在fsx文件中定義時?我收到一個錯誤。 fsx文件位於項目列表中的上方..重命名爲fs後錯誤消失,出現切換回fsx – nicolas

+0

@nicolas我只嘗試從命令行手動運行編譯器。我認爲它只會在'fsx'文件被標記爲編譯時才起作用 - Visual Studio在「輸出」窗口中打印的命令行命令是什麼?你能看到'fsx'文件嗎? –

0

我認爲最簡單的解決方案是將你想要測試的代碼放在一個單獨的*.fs文件中。在您的*.fsx腳本中,可以使用#load指令從*.fs文件(#load工作,如C/C++中的#include)加載代碼。

對於單元測試,您可以創建一個簡單的F#庫項目,其中包括使用<Link>*.fs文件(如在Tomas的答案中),然後針對編譯後的DLL運行單元測試。