2016-11-04 7 views
0

(私の英語は申し訳ありません)私はC++のコードから単体テストをしようとしています。次の関数(メニュー)では、()へのパラメータはありません。しかし、このファンクションにはscanfがあります。これはテストしたいのですが、どうやって作るのか分かりません。ユニットテストScanf

ユニットテストからscanfをテストできますか?

ありがとうございます。機能から

コード:テストから

void principal::menu() 
{ 
    int choice; 
    system("cls"); 
    printf("\n--------MENU--------"); 
    printf("\n1 : Jugador X"); 
    printf("\n2 : Jugador O"); 
    printf("\n3 : Sortir"); 
    printf("\nTria el tipus de jugador: "); 
    scanf_s("%d", &choice); 
    turn = 1; 
    switch (choice) 
    { 
    case 1: 
     player = 1; 
     comp = 0; 
     player_first(); 
     break; 
    case 2: 
     player = 0; 
     comp = 1; 
     start_game(); 
     break; 
    case 3: 
     exit(1); 
    default: 
     menu(); 
    } 
} 

コード:

... 
TEST_METHOD(menu){ 
    principal p; //this is the class --> not matter now 

    //test code 
} 

コードは、私は次のコードのパラメータを使用している場合:あなたがCを使用している場合

... 
TEST_METHOD(menu){ 
    principal p; //this is the class --> not matter now 

    //test code 
    Assert::AreEqual(result, parameter to enter); 
} 
+0

既存のコードを変更できますか?次に、menu()を2つの関数に分割する必要があります.1つはメニューを表示し、入力を読み取る関数、もう1つは入力に作用する関数です。これは簡単にテストできます。 – Rene

+0

入力していない場合、* UXの場合:入力パラメータをテキストファイルに書き込み、入力リダイレクションを使用してテキストファイルにテストプログラムを実行した後、menu()を呼び出して結果をテストできます。同じファイルに複数の入力値を設定してから、menu()を複数回呼び出すこともできます。 (もちろん、fdupを使った他の、しかしより複雑な解決法があるでしょう) – Rene

答えて

1

を++関数cinとcoutを使用すると、バッファをリダイレクトできます。

など。

#include <iostream> 
#include <sstream> 
#include <random> 
#include <ctime> 

int main() 
{ 
    auto cout_buf = std::cout.rdbuf(); 
    std::stringbuf sb; 
    std::cin.rdbuf(&sb); 
    std::cout.rdbuf(&sb); 

    std::mt19937 rand(time(nullptr)); 
    std::cout << (rand() % 100); 

    int number; 
    std::cin >> number; 

    std::cout.rdbuf(cout_buf); 
    std::cout << "The number was " << number << std::endl; 

    return 0; 
} 
+0

'C/C++'は言語ではありません。 –

+0

ええ、確かにそうではありません。私はその問題を見たと思ったが、私は間違っていた。 – MacUseless

+0

それはC++だと言っているので、私はまだ明らかです:) – MacUseless