测试驱动开发 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

本文关键字:添加 测试 播放列表 开发 对象 向量 c++      更新时间:2023-10-16
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一首歌曲。在那一刻,那个矢量只有一个元素,你刚刚推送的那首歌。你返回它,但在你调用函数的方法中你没有对它做任何事情,所以向量只是被销毁并释放了它的内存。假设 Playlist 类具有保存歌曲的私有向量,则在该方法中应执行的操作是将歌曲push_back该向量上。不是你刚刚在那里创造的东西。

我认为mySongs是你最终想要包含这首歌的载体,所以它会像这样

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