前提・実現したいこと
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#
1public ActionResult Index() 2 { 3 LargeViewModel vm = new LargeViewModel(); 4 5 vm.a = aa; 6 vm.bb = bb; 7 8 var connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 9 using (var conn = new MySqlConnection(connectionString)) 10 { 11 12 var ichiranTable = _userViewModelData.GetAllClients(Param1, Param2, Param3, conn); 13 vm.IchiranTable = ichiranTable.Select(x => new UserViewModel(x)); 14 return View(vm); 15 } 16 }
TestController
C#
1[TestClass] 2 public class LargeControllerTest 3 { 4 [TestMethod] 5 public void Index() 6 { 7 LargeController controller = new LargeController(new DBTest()); 8 9 ViewResult result = controller.Index() as ViewResult; 10 11 12 Assert.IsNotNull(result); 13 //↓IchiranTableにアクセスしたいが、上記エラーメッセージ表示。result.ModelにするとLargeViewModelが指定される 14 Assert.IsInstanceOfType(result.Model.IchiranTable, typeof(IEnumerable<UserViewModel>)); 15 16 17 var model = (result.Model as IEnumerable<UserViewModel>).ToArray(); 18 Assert.IsFalse(model[0].IsInstalled); 19 Assert.IsFalse(model[1].IsInstalled); 20 Assert.IsFalse(model[2].IsInstalled); 21 Assert.IsTrue(model[3].IsInstalled); 22 } 23 }
DBTest
C#
1public IEnumerable<UserViewModel> GetAllClients(string Param1, string Param2, string Param3, MySqlConnection conn) 2 { 3 return new UserViewModel[] 4 { 5 new UserViewModel() { UserId = 0, UserName = "あ", TestFlg = 1}, 6 new UserViewModel() { UserId = 100, UserName = "い", TestFlg = 2 }, 7 new UserViewModel() { UserId = 200, UserName = "う", TestFlg = 3 }, 8 } 9 }
LargeViewModel
C#
1public class LargeViewModel 2 { 3 4 public LargeViewModel() 5 { 6 7 } 8 public IEnumerable<SelectListItem> AList { get; set; } 9 10 public IEnumerable<SelectListItem> BList { get; set; } 11 12 public IEnumerable<SelectListItem> CList { get; set; } 13 14 public IEnumerable<UserViewModel> IchiranTable { get; set; } 15 16 public string a { get; set; } 17 18 public string b { get; set; } 19 20 public string c { get; set; } 21 }
UserViewModel
C#
1public class UserViewModel 2 { 3 public UserViewModel() 4 { 5 6 } 7 public UserViewModel(UserViewModel x) 8 { 9 UserId = x.UserId; 10 UserName = x.UserName; 11 TestFlg = x.TestFlg; 12 IsInstalled = (x.TestFlg == (int)TestType.Installed); 13 } 14 public int UserId { get; set; } 15 16 public string UserName { get; set; } 17 18 public int TestFlg { get; set; } 19 20 public bool IsInstalled { get; set; } 21 22 } 23 24 public enum TestType 25 { 26 Test = 9, 27 Test1 = 1, 28 Test2 = 2, 29 Installed = 3, 30 Test3 = 4, 31 Test4 = 0 32 }
試したこと
補足情報(FW/ツールのバージョンなど)
情報不足している場合は、仰ってください。
そもそも論だけど「単体」テストならDBにアクセスしている部分を抽象化して切り離さないとダメじゃね?
あとデバッグしてテスト対象のコード側で値がちゃんと取れてるかどうか確認してるんだろうか。
テスト用のDBにアクセスして、result.Model直下にIchiranTableがあるのを(値を取得できているのも)確認できているのですが、IchiranTableにアクセスすると定義されていないといわれております。
何を作っているか (WPF? ASP.NET MVC? その他?) と開発環境 (OS, Visual Studio のバージョン、Core か .NET Framework どっちなのかとそのバージョンなど) を書いてください。
何を作っているか (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
上の情報は質問欄を編集して追記願います。ここコメント欄は「質問への追記・修正の依頼」の場所ですし、初期画面では閉じていて読まない人もいますので。
ASP.NET のタグをつけてください。モデルの定義も追記してください。
修正しました
単体テスト、O/R マッパー Dapper、DI コンテナ Autofac とか言われて、何故単体テストが期待通りに動かないかという話ですと自分には分からない部分が多くてお手上げです。単体テストの話ではなく、提示された Model とダミーの GetAllClients メソッドだけを使って Controller が期待通り動くのかという話ならフォローできそうです。それでもよければその旨返事ください。
それではダメならこのコメントはスルーしてください。すみませんが自分は撤退します。他の方の回答をお待ちください。
はい、期待通りTestControllerが動くようにしていただけることをのぞんでおります。
質問者さんのコードをコピペして、間違いは直して試してみましたが、return View(vm); の vm には期待通りの結果が得られていました。もちろん質問に書いてあったような例外も出ません。ということで、「単体テスト」の方に何か問題がありそうです。
回答欄に検証に使ったコードと取得できた vm の画像を貼っておきます。
何にもわかってないですけど、キャストがいるってだけじゃないんですか?
((LargeViewModel)result.Model).IchiranTable
TN8001さん
キャストが問題でした。ありがとうございます!!
TestController というのはどのようにして作ったのですか?
回答2件
あなたの回答
tips
プレビュー
