2011-12-07 52 views
0

我一直在嘗試爲MSTest中的Silverlight 4項目開發一些單元測試,但我在運行時遇到了一些麻煩。在我的代碼中,我使用了一些表達式(System.Linq.Expressions),並且在正常情況下運行該程序時它們正常工作。但是,如果在單元測試過程中遇到任何此代碼,我會在'AppDomain'類型上得到'MissingMethodException'Silverlight 4單元測試;加載了mscorlib的錯誤版本

我已將問題追溯到mscorlib.dll中定義了「AppDomain」這一事實。當我正常運行程序時,加載了mscorlib(Silverlight 4)的2.0.5.0版本,並且在單元測試下加載了2.0.0.0版本。我的測試和正常項目中的所有參考都是正確的,所以我無法弄清楚爲什麼MSTest加載了錯誤的版本。

有沒有辦法讓MSTest或VSTestHost實際加載正確版本的mscorlib? (2.0.5.0)

回答

1

問題是,您正在使用.NET框架的一個版本運行測試,另一個版本在正常情況下運行您的代碼。 Silverlight和.NET是兼容的,Silverlight程序集經常可以從.NET使用而不會出現問題(即使Visual Studio給出了參考警告),但也有一些例外。

例如,以這種方式運行Silverlight代碼,不能使用任何Silverlight UI類。 (任何FrameworkElement,DependencyObject,Dispatcher或類似的),因爲它們需要正確的運行時。我不驚訝AppDomain也屬於這個類別。

要解決此問題,您可以確保只測試與上述類沒有依賴關係的代碼,也可以將源代碼交叉編譯爲完整的.NET項目。後者並不能解決你的不兼容問題,但可以讓你編譯稍微不同的代碼版本,讓代碼編譯和運行乾淨。

請注意,mscorlib不像任何其他的.NET程序集,它充滿了討厭的本地代碼引用,並且無法以任何有意義的方式在預期的運行時之外使用。

+0

嗯......這些選項似乎不合理。爲什麼這一定很難? –

+0

如果他們不同意你的話,我很抱歉,那些是你的選擇。這很難,因爲.NET和Silverlight是兩個不同的運行時,它們恰好看起來很相似,碰巧爲模塊(程序集)使用相同的二進制文件格式。 – SoftMemes

+0

這不是你的錯。似乎有一些方法可以實現這一點。我可以手動將mscorlib(2.0.5.0)手動加載到Test的應用程序域,但還沒有完全弄清楚如何讓它進入jive。 –

-1

SL4與MSTest不兼容。您必須創建一個SL4單元測試項目(這是一個特殊項目) - 然後將其設置爲啓動項目。在運行這個項目時,單元測試是通過一個小UI(在瀏覽器中)執行的,顯示執行的單元測試的結果。

編輯: 一些使用MSTest的單元測試取得了成功。然而爲了做到這一點,你必須做好幾個竅門。單元測試不會在SL4環境中執行,因此單元測試結果無效。

+0

MSTesting已經與Silverlight合作一段時間了。您可以爲Visual Studio安裝包含silverlight測試項目模板的Silverlight 4工具。 –

+0

試試看:forums.silverlight.net/t/138721.aspx/1aa。 ...我們正在開發一個可以在Silverlight Toolkit中發佈的命令行解決方案,不幸的是,今天的單元測試MSTest和Visual Studio集成不適用於Silverlight測試... –

+1

Morten,理論上你是正確的,他們使用不同的運行時間,即使你解決了這些問題,你也不會測試「同樣的事情」。但是,人們(包括我自己)是否可以成功地將傳統的單元測試框架用於Silverlight程序集或交叉編譯的Silverlight代碼。 – SoftMemes