プロが教えるわが家の防犯対策術!

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を切り替えれば良いのですが、質問意図としては関数切り替えになりますので、そこについてはスルーでお願いします。

質問者からの補足コメント

  • 開発環境はVisualStudio2015 Professionalになります。

      補足日時:2018/09/20 11:39

A 回答 (3件)

その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を外から引数等で呼べるようにするのが
テストのしやすさ、保守性、リファクタリングのしやすさからみて
一番いいんですが。。。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ご回答の内容通り、TestableMainクラスのgetにpublic override、mainクラスのgetにpublic virtualで解決しました。

お礼日時:2018/09/21 10:46

ごめんなさい、get()にはoverrideをつけないといけませんね。

    • good
    • 0

切り替える関数ごとにテストを作るのではだめですか?


ユニットテスト(に限らずテストは)なるべくlogicを持たないほうがいいと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
伝え方が悪く、申し訳ありません。切り替え関数ごとにテスト関数を作りたいと考えています。
例)
[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"に切り替えを行いたいと思っております。
ただ、まさにその切り替え方法がわからず、ご教授頂けないかと質問させていただいた次第です。

お礼日時:2018/09/20 14:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!