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

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

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

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

Q&A

解決済

1回答

16288閲覧

単体テストにおけるメンバ変数の扱い方

---stax---

総合スコア148

C#

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

0グッド

0クリップ

投稿2017/12/01 01:34

編集2017/12/01 01:37

表題の件で質問させてください
現在単体テストの学習を行っているのですが
テスト対象の引数なしのメソッド内にメンバ変数を使用している場合にテストメソッドからどう渡せばよいでしょうか?

初歩的な質問で申し訳ありませんがアドバイスよろしくお願いいたします

テストメソッド

C#

1 [TestClass()] 2 public class comboboxdataTests 3 { 4 comboboxdata _comboboxdata = new comboboxdata(); 5 6 [TestMethod()] 7 public void combodataGetTest() 8 { 9      //関数は呼び出せるがメンバ変数が渡せない 10 _comboboxdata.combodataGet(); 11        12 13 } 14 }

C#

1public class comboboxdata 2 { 3 4 5 public DataTable Combotb { get; set; } 6 public Dictionary<string, int> Dic3 { get; set; } 7 8 9 NpgsqlCommand command; 10 Dictionary<string, int> dic3 = new Dictionary<string, int>(); 11 12 13 public void combodataGet() 14 { 15 var connString = "Server=test;Port=5432;User Id=test;Password=test;Database=test;"; 16 using (var conn = new NpgsqlConnection(connString)) 17 { 18 conn.Open(); 19 20 //列データ取得SQL 21 command = new NpgsqlCommand("select line_name,line_num from kado_sys.line_mstr ", conn); 22 23 //変数commandのSQLの内容をExecuteReader()で読み取り変数dataReaderに代入 24 var dataReader = command.ExecuteReader(); 25 26 DataTable combotb = new DataTable(); 27 28 combotb.Columns.Add("line_name"); 29 30 //DataTableのインスタンスにsublinerow1という行を定義 31 var sublinerow1 = combotb.NewRow(); 32 33 //tbのname列のrow1(name)行のセルに全サブラインを定義 34 sublinerow1["line_name"] = "全サブライン"; 35 36 //tbのname列のrow1(name)行のセルに全サブラインを挿入 37 combotb.Rows.Add(sublinerow1); 38 39 while (dataReader.Read()) 40 { 41 //DataTableのインスタンスにsublinerow2という行を定義(1:0) 42 var sublinerow2 = combotb.NewRow(); 43 { 44 //dic3:ST名をキーに指定([0]はST名,[1]はST番号)、ST番号をバリューに指定 45 dic3[dataReader[0].ToString()] = Convert.ToInt32(dataReader[1]); 46 47 //dic3[dataReader[0].ToString()] = combotb.Rows.Count; 48 sublinerow2["line_name"] = dataReader["line_name"]; 49 // dataReader["line_name"]はDBからとってくるデータの為名前は欲しい列と一致させる 50 } 51 combotb.Rows.Add(sublinerow2); 52 } 53 54 dic3["全サブライン"] = -10; 55 Combotb = combotb; 56 Dic3 = dic3; 57 58 59 } 60 } 61 } 62}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご質問の意図が「privateなフィールド(メンバー変数)を参照する引数無しのメソッドを単体テストするにはどうしたらいいのか」と言うことで回答させていただきます。

privateなフィールド(メンバー変数)を単体テスト側から操作したい場合はPrivateObjectクラス(Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject)を使うことでセットできます。
これで(単体テストの為に)publicなフィールドやプロパティを用意しなくてもよくなります。若干面倒くさいコードになりますが。

teratailの過去の質問回答ですが、こちらが参考になると思います。
リフレクションでプライベートメンバを取得したい

せっかくですので、質問者様の単体テストにこれを使用してみたコードを例示します。少し冗長にしていますので、ご利用の際は適当に取捨選択してください。

C#

1[TestMethod()] 2public void combodataGetTest2() 3{ 4 //関数は呼び出せるがメンバ変数が渡せない 5 _comboboxdata.combodataGet(); 6 7 var obj = new PrivateObject(_comboboxdata); 8 9 // comboboxdataクラスのprivateフィールド dic3 にアクセスする。 10 11 var field = obj.GetField("dic3"); 12 if (field is Dictionary<string, int>) 13 { 14 var dic = (Dictionary<string, int>)field; 15 // 値をセットする。 16 dic.Add("Key1", 1); 17 dic.Add("Key2", 2); 18 dic.Add("Key3", 3); 19 } 20 21 // dic3の内容を出力してみる(※後述) 22 _comboboxdata.DumpPrivateDic3(); 23}

この例の確認用に、comboboxdataクラスに以下のpublicメソッドを追加してます。

C#

1public void DumpPrivateDic3() 2{ 3 Debug.WriteLine("dic3: number of items={0}", dic3.Count); 4 foreach (var k in dic3.Keys) 5 { 6 Debug.WriteLine(" -- k={0}, v={1}", k, dic3[k]); 7 } 8}

テストメソッドcombodataGetTest2を実行すると、デバッグ端末に以下のように出力します。privateフィールドのdic3へ外からセットした値がダンプできていることが分かります。

plain

1dic3: number of items=3 2 -- k=Key1, v=1 3 -- k=Key2, v=2 4 -- k=Key3, v=3

投稿2017/12/01 04:58

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問