今回ご紹介させていただくことの概要
ご覧いただきありがとうございます.UnitTestは良い作品作りには大切な技術ですので,ぜひMAUIでもできるようにしたいですよね.ところが,MAUIにユニットテストを導入するとエラーが出てしまいます.
エラーが出る原因と内容を手っ取り早く確認し,素早く解決できるようにご案内させていただきます.
エラーの内容と原因
MauiでXunitTestやNUnitテストをそのまま実行すると,参照を追加した時にエラーコード「NU1021」が表示されてプログラムが実行できません.
原因は,MauiとUnittestのプロジェクトに互換性がないことです.
解決策
この問題を解決するためには,Mauiのプロジェクトファイルのターゲットフレームワークに「net6.0」を追加する必要があります.
ところが「net6.0」を追加すると今度は,「エントリポイントに’Main’メソッドを含んでいません」と表示されます.
ここで,ターゲットフレームワーク「net6.0」の出力形式を変更することで,エントリポイントの問題も解決します.
これですべての問題が解決し,MAUIでユニットテストができるようになります.
問題点
MAUIで,UnitTestをするときの問題点
MAUIでUnitTestを行うために,XunitTestやNUnitTestプロジェクトを追加作成して,MAUIプロジェクトをUnitTestプロジェクトの参照に追加すると,エラーコード「NU1021」が表示されます.
原因はUnitTestとMAUIプロジェクトの互換性がないことだとエラー内容から分かります.
この記事では,互換性を持たせることでのエラー対処法をご紹介します.
操作の前提
Mauiのプロジェクトにテスト用の「XunitTest」や「NunitTest」などのUnitTestプロジェクトを追加し,Mauiプロジェクトの参照をUnitTestに加えている状態であることを前提とします.
エラー解決法
エラー解決のための操作
まずMAUIプロジェクトを開き,次にプロジェクトファイル(ソリューションと同名のファイル)を開きます.中にはXML形式のデータがあるので,<TargetFrameworks>で囲まれている部分をデータ中から見つけ出して.
そして,中に「net6.0」を追加します.
追加前
<TargetFrameworks>net6.0-android;net6.0-ios;net6.0-maccatalyst</TargetFrameworks>
追加後
<TargetFrameworks>net6.0;net6.0-android;net6.0-ios;net6.0-maccatalyst</TargetFrameworks>
次に,同じデータファイルの中から<OutputType>を探し,<OutputType Condition=”‘$(TargetFramework)’ != ‘net6.0′”>と変更します.
追加前
<OutputType>Exe</OutputType>
追加後
<OutputType Condition="'$(TargetFramework)' != 'net6.0'">Exe</OutputType>
これで,設定は終了.これを再ビルドすれば無事に参照のエラーがなくなります.
各操作の説明
Mauiプロジェクトの<TargetFrameworks>にnet6.0を追加することで,UnitTestとMauiのプロジェクトのターゲットフレームワークが同一になり,互換性の問題が解決します.
また,<OutputType>の変更は,net6.0の出力ファイルの形式を変更しています.
この場合「net6.0」のみ<OutputType>が指定されていないため,Exeの代わりに自動的にLibralyが設定され,コードライブラリが作成されるようになります.
これは,設定が「Exe」の場合にエントリポイント(Mainメソッド)が含まれていないとエラー表示されてしまうため,エントリポイント無しでプログラムが動くようにするために設定しています.
考察
今回の解決策
今回の解決法では,MAUIプロジェクトのターゲットフレームワークを変更することで対応しましたが,MAUI側のプロジェクトに変更を加えてしまう方法である点が弱点だと考えられます.
とはいえ,最もスマートな解決法の一つだと私は考えたので紹介させていただきました.
参考
- Gerald Versluis「Unit Testing .NET MAUI Apps with xUnit」<https://www.youtube.com/watch?v=C9vIDLQwc7M>(2022/08/07)