VisualStudio2015を使用しています。
MVCのWebアプリケーションに対して、単体テストを行うべくテストプロジェクトを作成しました。
テストプロジェクトからはWebアプリケーションのプロジェクトを参照しています。クラスも読み取る事が出来ます。
問題は、resxファイルに定義している文字列を取得できない事です。
どうにかしてresxの中から文字列を取りたいので、助けて頂きたいです。
resxファイルは、Webアプリケーションのプロジェクトの以下のような場所にあります。(SampleWebAppがプロジェクト名です)
SampleWebApp\App_GlobalResources\SampleMessageResource.resx
このリソースファイルの設定で、「アクセス修飾子」をpublicにしました。自動的にコードが生成されました。
プロパティは、
- カスタムツール PublicResxFileCodeGenerator
- ビルドアクション コンテンツ
- 出力ディレクトリにコピー 常にコピーする
となってます。
自動的に生成されたコードは、きっとresxを呼んでくれるであろうと期待しました。
メッセージとして、以下のように設定しました。
名前 | 値 |
---|---|
SampleMsg | さんぷるだよ |
テストコード上で、以下のようにコードを入れました。
C#
1var msg = SampleWebApp.App_GlobalResources.SampleMessageResource.SampleMsg;
このコードは例外となりました。
log
1結果 のスタック トレース: 2場所 System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName) 3 場所 System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 4 場所 System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 5 場所 System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 6 場所 System.Resources.ResourceManager.GetString(String name, CultureInfo culture) 7 8(中略) 9テスト メソッド SampleWebApp.Test1 が例外をスローしました: 10System.Resources.MissingManifestResourceException: 指定されたカルチャまたはニュートラル カルチャに対して適切なリソースが見つかりませんでした。 "SampleWebApp.App_GlobalResources.SampleMessageResources.resources" が適切に埋め込まれたか、実行時にアセンブリ "SampleWebApp" にリンクされたか、または必要なサテライト アセンブリが読み込まれて完全に署名されていることを確認してください。 11
もしかしたらファイルが見つからないのかと思って、テストプロジェクト内のbin/Debug ディレクトリの中をのぞいたら、
App_GlobalResourcesディレクトリに SampleMessageResource.resx ファイルが存在していました。
ファイル自体が無いわけではないようです。読み取る方法が間違えているのでしょうか。
気になるのは、 SampleMessageResource.resx のプロパティでカスタムツールが「PublicResXFileCodeGenerator」となっているのに、例外を見る限り resources ファイルを見に行っています。これでは見つからないのも当然に思えます。
SampleMessageResource.Designer.cs が自動生成されているのですが、この中を見てると ResourceManager を使用しています。こんな感じです。
C#
1global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SampleWebApp.App_GlobalResources.SampleMessageResource", typeof(SampleMessageResource).Assembly);
こちらのサイトを参考にしてみたんのですが、どうも ResourceManager は リソースの「*.resources」形式を読み取るように作られているようです。
どうすればテストコード上でWebアプリのresxのリソースファイルから文字列を取得できるでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/07 06:00