首页 > 解决方案 > 为 get 函数编写一个 gtest

问题描述

这是我为这个函数编写 gtest 的尝试

实际代码

复合模式 UML

我不知道如何解决这个问题我正在尝试找到为这些函数编写 gtest 的最有效方法。我不知道我是否在测试中正确调用了类和对象,而且我不确定我是否需要设置器才能设置字符串值,甚至不确定如何使用多个字符串进行设置

#include "Datetime.h"
#include <string>
#include <vector>
using namespace std;
    
class Task
{
   private:
       Date date;
       Date deadline;
       Vector<Task*> subtasks;
       string tag;
       string description;
       int priority;
   public:
       DateTime get_date() {return date;}

       DateTime get_deadline() {return deadline;}

       Vector<Task*> get_subtask() {return subtasks;}

       string get_tag() {return tag;}

       string get_description() { return description;}

       int get_priority() {return priority;}

       void add_subtask(Vector<Task*> subtasks) {subtasks.push_back(subtasks);}

       void remove_subtask(Vector<Task*> subtasks) {subtasks.erase(tasks.begin() + i);}
};

标签: c++googletest

解决方案


您的add_subtaskremove_subtask函数似乎有一个令人困惑或不正确的签名。也许尝试为这些编写测试会有所帮助?

目前,与子任务相关的签名是:

class Task
{
   public:
       /* ... */

       Vector<Task*> get_subtask() {return subtasks;}

       void add_subtask(Vector<Task*> subtasks);  // Why multiple subtasks
       void remove_subtask(Vector<Task*> subtasks); // Impl was wrong
};

我认为这样的签名可能更有意义:

class Task
{
   public:
       /* ... */

       Vector<Task*> get_subtasks() const { return subtasks; }

       // Add one subtask.  Throws an exception if `subtask` is `this`.
       void add_subtask(Task* subtask);

       // Remove the indicated subtask, if it is present, and return
       // whether it was removed.
       bool remove_subtask(Task* subtask); 
};

在此之后,您可以编写如下测试:

TEST(TaskTest, SubtasksInitiallyEmpty) {
  // When a Task is initially constructed, it has no subtasks.
  Task t;
  const std::vector<Task*> subtasks = t.get_subtasks();
  EXPECT_TRUE(subtasks.empty());
}

TEST(TaskTest, AddSubtask) {
  // When `add_subtask` is called with a user-provided task,
  // the task’s subtasks contains that task.
  Task t;
  Task s;
  t.add_subtask(&s);

  const auto& subtasks = t.get_subtasks();
  ASSERT_EQ(subtasks.size(), 1);
  EXPECT_EQ(subtasks.front(), &s);
}

TEST(TaskTest, AddSelfAsSubtaskThrows) {
  // When `add_subtask` is called with `this` as an argument,
  // an exception is thrown.
  Task t;
  EXPECT_THROW(t.add_subtask(&t), std::runtime_error);
}

我没有包括 的测试remove_subtask,但它们会有类似的结构。


推荐阅读