質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

解決済

C# ViewModelのテストについて

yo_si
yo_si

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

2回答

0評価

0クリップ

458閲覧

投稿2021/11/22 15:46

編集2021/11/23 03:06

前提・実現したいこと

C#での単体テストについてお伺いしたいです。
単体テスト時にLargeViewModelの中のIEnumerable型のUserViewModelにアクセスしたいのですが、「Objectに定義
が含まれていない」といわれます。
ご教授ねがいます!!

環境
ASP.NET MVC
OS Windows10
Visual Studio のバージョン Microsoft Visual Studio Community 2019 Version16.11.3
.NET Framework 4.8

発生している問題・エラーメッセージ

CS1061

'<型>' に '<名前>' の定義が含まれておらず、型 '<型>' の最初の引数を受け付けるアクセス可能な拡張メソッド '<名前>' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

該当のソースコード

Controller

C#

public ActionResult Index() { LargeViewModel vm = new LargeViewModel(); vm.a = aa; vm.bb = bb; var connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; using (var conn = new MySqlConnection(connectionString)) { var ichiranTable = _userViewModelData.GetAllClients(Param1, Param2, Param3, conn); vm.IchiranTable = ichiranTable.Select(x => new UserViewModel(x)); return View(vm); } }

TestController

C#

[TestClass] public class LargeControllerTest { [TestMethod] public void Index() { LargeController controller = new LargeController(new DBTest()); ViewResult result = controller.Index() as ViewResult; Assert.IsNotNull(result); //↓IchiranTableにアクセスしたいが、上記エラーメッセージ表示。result.ModelにするとLargeViewModelが指定される Assert.IsInstanceOfType(result.Model.IchiranTable, typeof(IEnumerable<UserViewModel>)); var model = (result.Model as IEnumerable<UserViewModel>).ToArray(); Assert.IsFalse(model[0].IsInstalled); Assert.IsFalse(model[1].IsInstalled); Assert.IsFalse(model[2].IsInstalled); Assert.IsTrue(model[3].IsInstalled); } }

DBTest

C#

public IEnumerable<UserViewModel> GetAllClients(string Param1, string Param2, string Param3, MySqlConnection conn) { return new UserViewModel[] { new UserViewModel() { UserId = 0, UserName = "あ", TestFlg = 1}, new UserViewModel() { UserId = 100, UserName = "い", TestFlg = 2 }, new UserViewModel() { UserId = 200, UserName = "う", TestFlg = 3 }, }

LargeViewModel

C#

public class LargeViewModel { public LargeViewModel() { } public IEnumerable<SelectListItem> AList { get; set; } public IEnumerable<SelectListItem> BList { get; set; } public IEnumerable<SelectListItem> CList { get; set; } public IEnumerable<UserViewModel> IchiranTable { get; set; } public string a { get; set; } public string b { get; set; } public string c { get; set; } }

UserViewModel

C#

public class UserViewModel { public UserViewModel() { } public UserViewModel(UserViewModel x) { UserId = x.UserId; UserName = x.UserName; TestFlg = x.TestFlg; IsInstalled = (x.TestFlg == (int)TestType.Installed); } public int UserId { get; set; } public string UserName { get; set; } public int TestFlg { get; set; } public bool IsInstalled { get; set; } } public enum TestType { Test = 9, Test1 = 1, Test2 = 2, Installed = 3, Test3 = 4, Test4 = 0 }

試したこと

補足情報(FW/ツールのバージョンなど)

情報不足している場合は、仰ってください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

gentaro

2021/11/22 15:51

そもそも論だけど「単体」テストならDBにアクセスしている部分を抽象化して切り離さないとダメじゃね? あとデバッグしてテスト対象のコード側で値がちゃんと取れてるかどうか確認してるんだろうか。
yo_si

2021/11/22 16:12 編集

テスト用のDBにアクセスして、result.Model直下にIchiranTableがあるのを(値を取得できているのも)確認できているのですが、IchiranTableにアクセスすると定義されていないといわれております。
SurferOnWww

2021/11/22 22:20

何を作っているか (WPF? ASP.NET MVC? その他?) と開発環境 (OS, Visual Studio のバージョン、Core か .NET Framework どっちなのかとそのバージョンなど) を書いてください。
yo_si

2021/11/23 00:01

何を作っているか (WPF? ASP.NET MVC? その他?) →ASP.NET MVC 開発環境 (OS, Visual Studio のバージョン、Core か .NET Framework どっちなのかとそのバージョンなど) を書いてください。 →OS Windows10 →Visual Studio のバージョン Microsoft Visual Studio Community 2019 Version16.11.3 →.NET Framework 4.8
SurferOnWww

2021/11/23 00:45

上の情報は質問欄を編集して追記願います。ここコメント欄は「質問への追記・修正の依頼」の場所ですし、初期画面では閉じていて読まない人もいますので。 ASP.NET のタグをつけてください。モデルの定義も追記してください。
yo_si

2021/11/23 01:32

修正しました
SurferOnWww

2021/11/23 02:33

単体テスト、O/R マッパー Dapper、DI コンテナ Autofac とか言われて、何故単体テストが期待通りに動かないかという話ですと自分には分からない部分が多くてお手上げです。単体テストの話ではなく、提示された Model とダミーの GetAllClients メソッドだけを使って Controller が期待通り動くのかという話ならフォローできそうです。それでもよければその旨返事ください。 それではダメならこのコメントはスルーしてください。すみませんが自分は撤退します。他の方の回答をお待ちください。
yo_si

2021/11/23 03:11

はい、期待通りTestControllerが動くようにしていただけることをのぞんでおります。
SurferOnWww

2021/11/23 04:50

質問者さんのコードをコピペして、間違いは直して試してみましたが、return View(vm); の vm には期待通りの結果が得られていました。もちろん質問に書いてあったような例外も出ません。ということで、「単体テスト」の方に何か問題がありそうです。
SurferOnWww

2021/11/23 04:53

回答欄に検証に使ったコードと取得できた vm の画像を貼っておきます。
TN8001

2021/11/23 10:09

何にもわかってないですけど、キャストがいるってだけじゃないんですか? ((LargeViewModel)result.Model).IchiranTable
yo_si

2021/11/23 13:15

TN8001さん キャストが問題でした。ありがとうございます!!
SurferOnWww

2021/11/23 14:01

TestController というのはどのようにして作ったのですか?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。