【问题标题】:Unit Test Scanf单元测试扫描
【发布时间】:2016-11-04 12:07:53
【问题描述】:

(对不起我的英语)我正在尝试从 C++ 代码中进行单元测试。在下一个函数(菜单)中,()中没有任何参数。但是在这个功能中有一个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
}

如果代码有参数我使用下一个代码:

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

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

【问题讨论】:

  • 可以修改现有代码吗?然后你应该将 menu() 分成两个函数,一个显示菜单并读取输入,另一个作用于输入,这样就很容易测试了。
  • 如果不是,并且您在 *UX:将输入参数写入文本文件,运行测试程序并将输入重定向到文本文件,然后您可以调用 menu() 并进行测试结果。您也可以在同一个文件中有多个输入值,然后多次调用 menu()。 (当然还有其他的,但是使用 fdup 的更复杂的解决方案)

标签: c++ visual-studio unit-testing testing


【解决方案1】:

如果您使用 C++ 函数 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;
}

【讨论】:

  • C/C++ 不是一种语言。
  • 好吧,当然不是。我以为我在问题中看到了这一点,但我错了。
  • 它确实说的是 C++,所以我仍然很清楚 :)
  • 你做到了,它在问题中。我刚刚编辑了它。您可以编辑您的答案以选择其中一种语言。
  • 另外,为了更深入地了解主题,main() 返回 intauto 需要 C++11。这反过来意味着您可以(并且应该)将 &lt;random&gt; 用于 PRNG 而不是 rand()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2022-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多