测试驱动开发 C++:如何根据歌曲将对象添加到播放列表的矢量并对其进行测试

Test Driven Development c++ : How do I add an object to a vector in terms of a song to a playlist and test it

void PlayListTester::testAddSong(){
   cout << "- addSong()... " << flush;
   PlayList pList("addSongTest.txt");
   Song s1("Badge", "Cream", 1969);
   Song s2("Godzilla", "Blue Oyster Cult", 1977);
   Song s3("Behind Blue Eyes", "The Who", 1971);
   pList.addSong(s1);
   vector<Song> searchResult = pList.searchByArtist("Cream");
   assert( searchResult.size() == 1 );
   assert( searchResult[0].getTitle() == "Badge" );
   assert( searchResult[0].getYear() == 1969 );
   assert( searchResult[0].getArtist() == "Cream" );
   cout << " 0 " << flush;

} 这是我为将 Song 对象添加到 PlayList 向量而创建的测试器方法,但我的问题是它不会引发错误,而是代码在第一个断言处终止。我只是很困惑到底是我的测试有问题还是我的方法本身有问题。

vector<Song> PlayList::addSong(const Song& newSong){
      vector<Song> v;
      v.push_back(newSong);
      return v;

这是我用的方法。看起来可能太简单了,但据我所知理论上应该可行。

PlayList::PlayList(const string& fileName) {
  // open a stream to the playlist file
  ifstream fin( fileName.c_str() );
  assert( fin.is_open() );

  // read each song and append it to mySongs
  Song s;
  string separator;
  while (true) {
      s.readFrom(fin);
      if ( !fin ) { break; }
      getline(fin, separator);
      mySongs.push_back(s);
  }

  // close the stream
  fin.close();

} 如果有帮助的话,这是我的 PlayList 构造函数。代码在断言大小处失败。

Playlist::addSong() 方法中,您只是制作一个包含 Song 对象的矢量对象,push_back 一首歌曲。在那一刻,那个向量只有一个元素,就是你刚刚推送的那首歌。你 return 它,但你没有在你调用函数的方法中对它做任何事情,所以向量被销毁并且它的内存被释放。假设播放列表 class 有一个保存歌曲的私有向量,您应该在该方法中做的是 push_back 该向量上的歌曲。不是你刚刚在那里创建的东西。

我认为 mySongs 是您最终想要包含歌曲的向量,因此它会遵循以下内容:

void PlayList::addSong(const Song& newSong) {
 this->mySongs.push_back(newSong);
}