Test Driven Development c ++: как добавить объект в вектор с точки зрения песни в плейлист и протестировать его - PullRequest
0 голосов
/ 17 сентября 2018
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, если это поможет.Сбой кода в размере assert.

1 Ответ

0 голосов
/ 17 сентября 2018

Внутри метода Playlist::addSong() вы просто создаете векторный объект, который содержит объекты Song, и перетаскиваете в него песню.В этот момент этот вектор имеет только один элемент - ту песню, которую вы только что нажали.Вы возвращаете его, но ничего не делаете с ним в методе, из которого вы вызвали функцию, поэтому вектор просто уничтожается, а его память освобождается.Предполагая, что класс Playlist имеет закрытый вектор, который содержит песни, вы должны сделать в этом методе push_back песню в этом векторе.Это не то, что вы только что создали.

Я думаю, что mySongs - это вектор, который вы в конечном итоге хотите содержать в песне, поэтому он будет выглядеть примерно так:

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