nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

WPF&xUnitでテストコードからViewオブジェクトを生成する方法

例えば次のコードがあったとします。

[Fact]
public void WhenClosed()
{
    var window = new Window();
}

これを実行すると次のようなエラーがでます。

f:id:nuitsjp:20170825115056p:plain

UIはテストしないんじゃないの?と言われそうな気もしますが、Windowに貼り付ける汎用Behaviorをライブラリ化して使いまわしたいとかいう時に、Windowインスタンスが作れないがためにUnitTest書けないじゃんてな事が、稀に良くあります。

WPFなどはUI層はSingle Thread Apartment(STA)なスレッド上で実行される必要があります(この表現はもしかしたら正しくないかもしれません)。
よくUIはUIスレッドで実行しろと言われるあれです。

xUnitはマルチスレッドでテスト実行されますし、STAではもちろんありません。どうしましょう?こまったな。
と思っていたら、神がいました。

www.nuget.org

このパッケージをインストールして次のようにコードを修正します。

[WpfFact]
public void WhenClosed()
{
    var window = new Window();
}

FactAttributeからWpfFactAttributeに変更するだけでちゃんとSTAで動作させてくれます。凄い!どうなってるの!?

という訳で、今日はこれだけ。
いやあ、自力で何とかしようとしかけて、しないで済んで助かったなあ。