Moles無法讀取app.config問題,非常弱的解決方法

因為Moles官方暫時還沒有辦法解決,讀取測試專案的app.config問題,我只有以繞遠路的方式去跳過這個問題,我最早的方式是手動去改Microsoft.Moles.VsHost.exe.config(詳情可參考Moles - Isolation framework for .NET介紹),而我們專案成員有5個加上1台Build Server,所以我要設6次,本以為設定一次就搞定了,但因為前幾天app.config的設定有變更,我一想到要改6台我就累了,而且當方案一多切換也是個麻煩,所以我想到以Post-build Event的方式,當從版本管理簽出後編譯完成時將測試專案的app.config去覆蓋Microsoft.Moles.VsHost.exe.config。

因為Moles官方暫時還沒有辦法解決,讀取測試專案的app.config問題,我只有以繞遠路的方式去跳過這個問題,我最早的方式是手動去改Microsoft.Moles.VsHost.exe.config(詳情可參考Moles - Isolation framework for .NET介紹),而我們專案成員有5個加上1台Build Server,所以我要設6次,本以為設定一次就搞定了,但因為前幾天app.config的設定有變更,我一想到要改6台我就累了,而且當方案一多切換也是個麻煩,所以我想到以Post-build Event的方式,當從版本管理簽出後編譯完成時將測試專案的app.config去覆蓋Microsoft.Moles.VsHost.exe.config。

NOTE:

小弟的一個方案中的多個測試專案是使用同一個app.config(以as Link方式加入),所以只在放app.config的實際測試專案中寫Post-build Event,如果每個測試專案有各自的app.config,請合併成一個,不然可能不適合用小弟的解決方法。

 

Post-build Event Command Line

Post-build Event Command Line是MSBuild中的一個事件,當專案編譯完成時執行此Command Line來做一些其他事情,如本文中是複制檔案。

1.在開啟測試專案的內容,選擇Build Event頁籤。

image

 

2.在Post-build Event Command Line中輸入

powershell -command "& '$(TargetDir)CopyConfigToMoles.ps1' -TargetPath:'$(TargetPath)'"

NOTE:

Post-build Event Command Line內容就跟在cmd輸入的一樣,這邊小弟用PowerShell只是因為我沒有寫過PowerShell,想來嘗試一下,也可以寫成bat檔用Call呼叫。

注意:如果是第一次使用,要把PowerShell的權限打開,請在PowerShell中輸入

	ps>set-executionpolicy remotesigned
ps>y

3.新增測試專案中新增CopyConfigToMoles.ps1檔案,並輸入

param($TargetPath)
write-output '==============File Copy Start=========='
$TargetPath = "$TargetPath.config"
$DevEnvDir1 = 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.Moles.VsHost.exe.config'
$DevEnvDir2 = 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.Moles.VsHost.x86.exe.config'
write-output "$TargetPath To $DevEnvDir1"
write-output "$TargetPath To $DevEnvDir2"
copy-item $TargetPath -destination $DevEnvDir1 -Force
copy-item $TargetPath -destination $DevEnvDir2 -Force
if($error.count -eq 0) {
    write-output '==============File Copy End============'
    exit 0
}else {
    write-output '==============File Copy Error============'
    exit 1
}

NOTE:

exit 0 與exit 1,是用來回報MSBuild的,當發生錯誤時回傳exit 1告訢MSBuild此Command Line發生了錯誤,不然預設是回傳0,發生錯誤了,是不會在Visual Studio中得知的(除非很認真看Output視窗)。

PowerShell的部分我就不多做說明,詳情請看Scripting with Windows PowerShell

 

參考資料