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