DBアクセス関係のクラスをテスト時にモックに差し替えたくて
ADO.NET周りのクラスのモックを作っていたんですが、
ただの.csファイルなのに、ソリューションエクスプローラーから開こうとしたら
デザイナで開こうとしてエラーになる現象に悩まされた。
↑こんな画面。
右のソリューションエクスプローラーを見ると
普通のクラスファイルと違うアイコンになっているのがわかる。
なんだこれはと思って.csprojをのぞいてみると
<ItemGroup> <Compile Include="MockConnection.cs"> <SubType>Component</SubType> </Compile> <Compile Include="MockDataReader.cs" /> <Compile Include="MockTransaction.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup>
このSubType=Componentとなっているのが問題のクラスだ。
このクラスで継承してるDbConnectionクラスがComponentのサブクラスなので
そういうこと?って思ったものの、解決策がわからず。
一応右クリック>コードの表示で開けるには開けるんだけども、
なんかじゃまくさいなぁと思っていた。
そんでググったら、StackOverflowで↓の情報を発見。
VS 2010 setting non-GUI class file as Component
見事に対処方法が書いてあって、
クラスの属性を以下のようにつけることで解決した。
[System.ComponentModel.DesignerCategory("Code")] class MockConnection : DbConnection { ... }
上記の回答者も書いてくれているんだけど、謎なことに
属性の「System.ComponentModel」をusingに入れて省略して書いてしまうと
解決しない。
VisualStudioはusing無視しますよ、だそうだ。まじか。