5

MvvmCross アプリケーション プロジェクトをセットアップし、それに対して単体テストを実行しようとしています (つまり、その中のビュー モデル)。OS X で Xamarin Studio を使用しています (執筆時点で最新の v. 4.0.4)。

MvvmCross アプリは、ポータブル クラス ライブラリとしてセットアップされます。テスト アセンブリは、NUnit フレームワークを参照するプレーンな Mono/.Net アセンブリ (PCL ではない) としてセットアップされます。

テストを実行しようとすると、System.TypeLoadException.

Mono バインディング ログオンでテストを実行しました。出力は次のとおりです。

Mono: /Users/jr/dev/rowinginmotion-cross/RowingInMotion.Mobile.BoatApp.Tests/bin/Debug/Cirrious.MvvmCross.dll から参照される次のアセンブリを読み込めませんでした: アセンブリ: システム (assemblyref_index=3) バージョン: 2.0.5.0 公開鍵: 7cec85d7bea7798e システム エラー: 無効な引数

Mono: アセンブリ Cirious.MvvmCross[0x559960] の読み込みに失敗しました

Mono: ファイルまたはアセンブリ 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' またはその依存関係の 1 つを読み込めませんでした。

このテスト設定はサポートされていません=

4

2 に答える 2

1

@Stuart の回答 (正しい) に加えて、目的のシナリオ (Mac OS および Windows でテスト可能な PCL アセンブリ) を達成できることがわかった 2 つ目の回避策を投稿したいと思います。

この回避策は、ワイルドカード インクルードのサポートを導入した Xamarin Studio 4.0.5 (またはそれ以降) に依存しています。

具体的には、Windows でコンパイルする場合、PCL をコンパイルし、テスト アセンブリからプロジェクト参照を追加します。Mac OS では、「PCL」もコンパイルします (現在、真の PCL サポートはありません) が、テスト アセンブリからはそのままにしておきます。代わりに、PCL プロジェクトのすべてのコードをワイルドカードでテスト アセンブリに含めて、OS X のテスト アセンブリにテスト + コードを含めます。

これには、いくつかの MSBuild マジックが必要です (Windows と OS X バージョンの間で MvvmCross 参照を切り替えるために使用される同様のトリック)。この .targets ファイルをプロジェクトの先頭に含めます。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
    <MvvmCrossPlatform>VS2012</MvvmCrossPlatform>
    <PclSupport>true</PclSupport>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
    <MvvmCrossPlatform>XS-iOS-Mac</MvvmCrossPlatform>
    <PclSupport>false</PclSupport>
  </PropertyGroup>
</Project>

次に、単体テスト .csproj で:

  <ItemGroup Condition=" '$(PclSupport)' == 'false' ">
    <Compile Include="..\RowingInMotion.Mobile.Backend\**\**.cs">    
      <Link>_Inlined\%(RecursiveDir)%(FileName)%(Extension)</Link>  
    </Compile>
  </ItemGroup>

  <Choose>
    <When Condition=" '$(PclSupport)' == 'true' ">
      <ItemGroup>
        <ProjectReference Include="..\RowingInMotion.Mobile.Backend\RowingInMotion.Mobile.Backend.csproj">
          <Project>{0B448743-182C-4ADC-8E97-7F9E7EF3A03A}</Project>
          <Name>RowingInMotion.Mobile.Backend</Name>
        </ProjectReference>
      </ItemGroup>
    </When>
  </Choose>

Choose コンストラクトを使用して ProjectReference を条件付きにする必要があることに注意してください。項目グループで Condition を使用するだけでは、Visual Studio と Xamarin Studio がプロジェクト参照をロード/無視することはないようです。また、Xamarin Studio はステートメントを適切に展開しないように見える%(RecursiveDir)...ため、ファイルは醜いファイル名を保持します (ファイルが _Inlined フォルダーに隠されている限り気にしません)。

于 2013-05-14T07:31:43.403 に答える