【问题标题】:Use googletest with a function that gets input from user via std::cin?将 googletest 与通过 std::cin 从用户获取输入的函数一起使用?
【发布时间】:2018-05-19 17:51:47
【问题描述】:

如何使用 googletest 测试依赖于用户通过 std::cin 输入的函数?

对于下面的示例,我正在寻找允许我将“2\n”添加到 std::cin 流的任何代码,以便 readUserInput() 函数将 2 读入 value 变量并且不需要用户的任何输入。

#include <iostream>
#include "gtest/gtest.h"

int readUserInput()
{
    int value;
    std::cout << "Enter a number: ";
    std::cin >> value;

    return value;
}

TEST(cin_test, Basic)
{
    // need code here to define "2\n"
    // as the next input for std::cin

    ASSERT_EQ(readUserInput(), 2);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

【问题讨论】:

    标签: c++ iostream googletest cin


    【解决方案1】:

    为你的函数添加一个参数:

    int readUserInput(std::istream& input)
    {
        int value;
        std::cout << "Enter a number: ";
        input >> value;
        return value;
    }
    
    TEST(Some, Test) {
        std::ifstream ifs;
        ifs.open("someFile", std::ifstream::in);
        // in production code pass std::cin
        std::cout << "readUserInput from std::cin: " << readUserInput(std::cin) << std::endl;
        // in testing pass some mock data from the file (or whatever)
        std::cout << "readUserInput from ifs: " << readUserInput(ifs) << std::endl;
        ifs.close();
    }
    

    【讨论】:

      【解决方案2】:

      TL:DR

      假设您将学习 JetBrains 单元测试教程: https://www.jetbrains.com/help/clion/unit-testing-tutorial.html#adding-framework

      MyLib/TaskTwo.cpp

      //Write a program reading integers until zero is entered and printing the length of the longest sequence of consecutive numbers of the same value (and this value).
      
      
      #include "TaskTwoResult.h"
      #include <iostream>
      using namespace std;
      
      class TaskTwo { ;
      public:
          TaskTwo() {
      
          }
      
          TaskTwoResult getLongestSequence(istream &std_input,
                                           ostream &std_output,
                                           ostream &result_output) {
              int largestToken = 0;
              int largestTokenOccurences = 0;
              int currentToken = 0;
              int currentOccurences = 0;
      
              std_output << "Please enter an integer value or enter 0 to stop" << endl;
      
              while (true) {
                  int token = 0;
                  std_output << "Enter value:";
                  std_input >> token;
                  if (token == 0) {
                      result_output << "Longest sequence: " << largestTokenOccurences << " times " << largestToken;
                      return {
                          largestToken,
                          largestTokenOccurences
                      };
                  }
      
                  const bool isNewToken = token != currentToken;
                  if (isNewToken) {
                      currentToken = token;
                      currentOccurences = 1;
                  } else {
                      currentOccurences++;
                  }
      
                  if (currentOccurences > largestTokenOccurences) {
                      largestTokenOccurences = currentOccurences;
                      largestToken = currentToken;
                  }
              };
          }
      };
      
      

      Google_Test/MyTests.cpp

      #include <gtest/gtest.h>
      #include "TaskTwo.cpp"
      
      using namespace std;
      
      
      
      //This is just a group -> test name so it will later be reflected in your IDE unit testing window as a tree:
      // getLongestSequence
      //   | - Test1
      //   | - Test2
      //   | - Test3
      TEST(getLongestSequence, Test1){
          //for input: 22 22 22 22 3 3 3 2 -6 -6 -6 0
          string test_input = "22\n22\n22\n22\n3\n3\n3\n2\n-6\n-6\n-6\n0";
          string expected = "Longest sequence: 4 times 22";
      
          stringstream fake_input(test_input);
          ostringstream fake_output;
          ostringstream fake_result_output;
      
          TaskTwoResult result = TaskTwo().getLongestSequence(fake_input, fake_output, fake_result_output);
      
          string actual = fake_result_output.str();
          EXPECT_EQ(expected, actual);
      }
      

      另见:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-18
        • 1970-01-01
        • 2013-07-31
        • 2021-01-03
        • 2022-08-07
        • 2012-10-28
        相关资源
        最近更新 更多