DeploymentItem属性に踊らされて死亡

このお話の結論

[TestMethod]
[DeploymentItem(@"img\src.bmp")]
public void Test00()
{
	...
}

とか書いた場合 "img\src.bmp" がコピーされるタイミングは、テスト自体を実行した時である。 その関数が実行される直前にコピーではない! あくまでテスト自体を実行開始した時である。

TestInitialize とか ClassInitialize とか AssemblyInitialize とかでブレーク貼ると、止まった時には既にファイルがコピーされているのだ…!

というわけで、(Test|Class|Assembly)Initialize で何かのファイルに依存する場合は、テキトーな TestMethod に合わせて DeploymentItem を書いておけば良いかなと思います。 もしくは、[TestMethod] void ResourceInitializer() とか DenependResourceDeployer() とか、それっぽい名前をもちつつ中身空っぽのダミーのテスト関数作ってそこにモリモリ書いていくとか。

…えー…… ('A`)


クラスに DeploymentItem属性 つけられてファイルコピーもされました。

[TestClass]
[DeploymentItem(@"img\src.bmp")]
public class TestClass
{
    ....
}

…えぇぇぇ… ('A`)('A`)('A`)

ことの始まり

とあるクラスのメンバ関数をテストを行いたかったのですが、そのクラスはコンストラクタで Image が要求さていました。この Image はファイルから読み込んで渡してあげれば良いのですが、定数的に変化しない内容である為テスト毎にファイルを読み込むのもダサい(ぉ*1 クラスのインスタンスはテスト毎に作り直すのは良い*2としても、Imageについては一旦読み込んだらそれ使い回すべさーと思い立ったは良いのですが………


ClassInitialize で死亡

テストクラス中1回読めばよかったので ClassInitialize でファイルを読み込むようにしました。

[ClassInitialize]
[DeploymentItem(@"img\src.bmp")]
public static void ClassInitializer(TestContext context)
{
    _srcImage = Image.FromFile("src.bmp")
}

ファイルが無ぇってさ

DeploymentItemTestMethod でしか有効でないらしいです。 嘘だろ承太郎!? じゃぁ自分でファイル持ってくるかーとか考えるわけですが、この ClassInitializer の時点で詰んでる。

  • カレントディレクトリが TestResults の下。[c:\\フロニャルド\\TestResults\\Deploy_millhi 2015-09-29 11_19_39\\Out] とか。
  • ファイルコピー元のディレクトリを引っ張ってこれない。 テストプロジェクトのあるディレクトリとか、その下の [bin\Debug] とか取れない…!
  • context の中に期待する情報があると思った? 残念! TestResults 以下のモノしか無ぇよ!!

どうすんねん…

ってか、じゃぁテスト実行時に元テストプロジェクトのパスが取得できないと、TestMethodDeploymentItemさんは、どーやってファイルコピーしてきてるのよ。 どこから元プロジェクトのパス引っ張ってきてるのよ? UnitTesting名前空間以下によさ気なクラスがあるわけでもなさそうだし…まさかのpdbからとか? …TestResults 以下にんなもんコピーされてないよ? 上上下下左右左右BA 押してもダメだったよ? ってか俺R右下Y下右下左右下右右AA派だよ?*3 ソレがダメすかもしや…!?




…と、色んな所にブレーク張りつつ調査した結果、ClassInitialize でブレークした時点で TestMethodDeploymentItem で指定したファイルが [TestResults] フォルダ以下にコピーされてるっていうねもうね。 DeploymentItemさんおめーその関数呼び出した時にコピーしてるんじゃねーのかよ!!おのれ!!

というわけで、ファイルはVisualStudioでテスト開始した際にコピーされると。そのタイミングであれば、Visual Studio 辺りがニャンヤンしてファイルコピーできそうですねと。はい解散。

*1:テストで何言ってんだおめーとか聞こえないー聞こえないー

*2:というか普通というか

*3:irem!