
C#の単体テストでテスト対象関数が、同クラス内の関数呼び出しをする場合に、呼び出し関数をテスト用のものに切り替えたいのですが、方法がよく分かりません。
テストはMSTESTで行います。
ご教授願いたく思います。
例)
class main{
private string data;
public main(){
data = "A";
}
public bool result(){
return get() == "AAA";
}
private string get(){
switch(data){
case "A": return "AAA";
case "B": return "BBB";
}
}
}
このresult関数の単体テストを戻り値true,falseの2ケース行いたいです。
それに際して、get関数を"AAA"固定と"BBB"固定で返すテスト用関数に切り替えて実行したいところなのですが、方法がよく分かりませんでした。
スタブだとインターフェースで切り替えるなどは見かけるのですが、同クラス内関数の切り替え方法の情報がつかめませんでした。
shim、fakesなども見かけたのですが、方法もよく分からず・・・。
申し訳ありませんが、ご教授ください。
※例の場合だと、TestMethodでメンバ変数dataを切り替えれば良いのですが、質問意図としては関数切り替えになりますので、そこについてはスルーでお願いします。
No.2ベストアンサー
- 回答日時:
その2つのテストで
>get関数を"AAA"固定と"BBB"固定で返すテスト用関数に切り替えて実行
をすればよいと思います。要するにgetのfakeですね。
get()をvirtualにして、
class TestableMain1 : main
{
...
string get() { return "AAA"; }
}
class TestableMain2 : main
{
...
string get() { return "BBB"; }
}
1番目のテストではmainの代わりにTestableMain1をinstantiateする。
2番目のテストではTestableMain2をinstantiateする。
あくまでresult()が正しいかどうかのテストですので、get()の動作は別途テストが必要ですね。
…でもスルーしてくれというからあえて書きませんでしたが、dataを切り替えるというか
dataを外から引数等で呼べるようにするのが
テストのしやすさ、保守性、リファクタリングのしやすさからみて
一番いいんですが。。。
ご回答ありがとうございました。
ご回答の内容通り、TestableMainクラスのgetにpublic override、mainクラスのgetにpublic virtualで解決しました。
No.1
- 回答日時:
切り替える関数ごとにテストを作るのではだめですか?
ユニットテスト(に限らずテストは)なるべくlogicを持たないほうがいいと思います。
回答ありがとうございます。
伝え方が悪く、申し訳ありません。切り替え関数ごとにテスト関数を作りたいと考えています。
例)
[TestMethod()]
public void resultTests1(){
main m = new main();
bool result =m.result();
Assert.IsTrue(result);
}
[TestMethod()]
public void resultTests2(){
main m = new main();
bool result =m.result();
Assert.IsFalse(result);
}
質問意図としては、result関数をそのまま呼ぶと、mainクラスのget関数が呼ばれてしまいます。
そこで、result関数が呼ぶget関数をresultTests1関数なら"AAA"を固定で返す関数に切り替え、resultTests2関数なら"BBB"に切り替えを行いたいと思っております。
ただ、まさにその切り替え方法がわからず、ご教授頂けないかと質問させていただいた次第です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HWNDへの変換
-
texに関する初歩的な質問
-
C#単体テストで同クラス内の呼...
-
VBからBeckyを使用したメール送...
-
C#の単体テストでローカル変数...
-
納品 vs ご納品 どちらが正し...
-
Windows server 2022 CALとSQL ...
-
営業職をやってます。先月発注...
-
テストについて
-
「スポット受注」はどういう意...
-
長さ0の文字列を格納できません...
-
見積書と発注書を兼用できるの...
-
発注書と見積書の品番が異なっ...
-
三菱製PLC:ファイルレジスタ(...
-
電子納品 CDへの捺印について
-
データ入力のインターフェース...
-
見積もりの言い方
-
納入日と納品日について
-
契約期間内における値上げ等に...
-
VBソースのバージョン管理ソフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
texに関する初歩的な質問
-
C#の単体テストでローカル変数...
-
VBからBeckyを使用したメール送...
-
テスト仕様書作成って初心者(...
-
JUnit結果出力をファイルに書き...
-
Excel-VBA コンテンツの作成日時
-
プログラマに渡すテスト結果に...
-
「クィエックメニュー」って、...
-
プログラムを実際に実行したと...
-
ホームページ・ビルダーで「e...
-
仕様書に書かれていないこと
-
単体テストについて
-
ソフト開発に関する仕様書の書...
-
テストオペレーターとして採用...
-
納品の定義,システムの動作の常...
-
単体テストについて
-
メッセージボックスのタイトル設定
-
VBで画像から線で囲まれた場所...
-
マーキーが表示されない
-
C#単体テストで同クラス内の呼...
おすすめ情報
開発環境はVisualStudio2015 Professionalになります。