Unit testing 单元测试-类型错误:';dict';对象不可调用

Unit testing 单元测试-类型错误:';dict';对象不可调用,unit-testing,flask-sqlalchemy,Unit Testing,Flask Sqlalchemy,一般来说,我对数据库不熟悉,如果这个问题太基本,我很抱歉 我正在尝试测试一个与曲目模型相关的播放列表模型 class Track(db.Model): """ Model for storing track information """ id = db.Column(db.Integer, primary_key=True) artist = db.Column(db.String(140)) title = db.Column(db.Strin

一般来说,我对数据库不熟悉,如果这个问题太基本,我很抱歉

我正在尝试测试一个与
曲目
模型相关的
播放列表
模型

class Track(db.Model):
    """
    Model for storing track information
    """
    id = db.Column(db.Integer, primary_key=True)
    artist = db.Column(db.String(140))
    title = db.Column(db.String(140))
    created = db.Column(db.DateTime, default=func.now())
    track_id = db.Column(db.String(140))
    tempo = db.Column(db.Float)      
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    def __init__(self, title, artist, uri):
        self.title = title
        self.artist = artist
        self.uri = uri

    @property
    def serialize(self):
       """Return object data in easily serializeable format"""
       return {
           'id' : self.id,
           'title': self.title,
           'artist': self.artist,
           'track_id': self.track_id,
            'tempo':self.tempo
       } 
然后我有一张二级表:

tracks = db.Table('tracks',
    db.Column('track_id', db.Integer, db.ForeignKey('track.id')),
    db.Column('playlist_id', db.Integer, db.ForeignKey('playlist.id')))
此处,播放列表型号:

class Playlist(db.Model):
    """
    Model for storing playlist information belonging to a specific user
    """
    __tablename__ = 'playlist'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50))
    created = db.Column(db.DateTime, default=func.now())    
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    tracks = db.relationship('Track', 
                            secondary=tracks,
                            backref=db.backref('playlists', 
                            lazy='dynamic'))

    def __init__(self, title):
        self.title = title

    @property
    def serialize(self):
       """Return object data in easily serializeable format"""
       return {
           'id' : self.id,
           'created' : self.created,
           'title': self.title,
           'tracks': [ item.serialize for item in self.tracks]
       }
现在我正在尝试测试播放列表,如下所示:

测试播放列表\u model.py

import unittest
# third party libs
from sqlalchemy.exc import IntegrityError
# application modules
from project.api.models.base import db
from project.api.models.all import Playlist, tracks
from project.tests.base import BaseTestCase
from project.tests.utils import add_playlist


class TestPlaylistModel(BaseTestCase):

    def test_add_track(self):

        track = add_track(title='Karma Police',
                          artist='Radiohead',
                          uri='spofity:test')

        self.assertEqual(track.title, 'Karma Police')
        self.assertEqual(track.artist, 'Radiohead')
        self.assertEqual(track.uri, 'spofity:test')


    def test_add_playlist(self):

        track = add_track(title='Karma Police',
                          artist='Radiohead',
                          uri='spofity:test')

        playlist = add_playlist(title='Alternative')
        self.assertEqual(playlist.title, 'Alternative')
        self.assertTrue(playlist.id)
        self.assertEqual(playlist.tracks, track.serialize())

if __name__ == '__main__':
    unittest.main()
from project.api.models.base import db
from project.api.models.all import Playlist

def add_playlist(title):
    playlist = Playlist(
        title=title)
    db.session.add(playlist)
    db.session.commit()
    return playlist

def add_track(title, artist, uri):
    track = Track(
                title=title,
                artist=artist,
                uri=uri
            )
    db.session.add(track)
    db.session.commit()
    return track
utils.py

import unittest
# third party libs
from sqlalchemy.exc import IntegrityError
# application modules
from project.api.models.base import db
from project.api.models.all import Playlist, tracks
from project.tests.base import BaseTestCase
from project.tests.utils import add_playlist


class TestPlaylistModel(BaseTestCase):

    def test_add_track(self):

        track = add_track(title='Karma Police',
                          artist='Radiohead',
                          uri='spofity:test')

        self.assertEqual(track.title, 'Karma Police')
        self.assertEqual(track.artist, 'Radiohead')
        self.assertEqual(track.uri, 'spofity:test')


    def test_add_playlist(self):

        track = add_track(title='Karma Police',
                          artist='Radiohead',
                          uri='spofity:test')

        playlist = add_playlist(title='Alternative')
        self.assertEqual(playlist.title, 'Alternative')
        self.assertTrue(playlist.id)
        self.assertEqual(playlist.tracks, track.serialize())

if __name__ == '__main__':
    unittest.main()
from project.api.models.base import db
from project.api.models.all import Playlist

def add_playlist(title):
    playlist = Playlist(
        title=title)
    db.session.add(playlist)
    db.session.commit()
    return playlist

def add_track(title, artist, uri):
    track = Track(
                title=title,
                artist=artist,
                uri=uri
            )
    db.session.add(track)
    db.session.commit()
    return track
但我得到了:

======================================================================
ERROR: test_add_playlist (test_playlist_model.TestPlaylistModel)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/src/app/project/tests/test_playlist_model.py", line 34, in test_add_playlist
    self.assertEqual(playlist.tracks, track.serialize())
TypeError: 'dict' object is not callable

我缺少什么?

您的方法
Track.serialize
实际上是一个属性,这意味着当您访问字典时,它会像访问属性一样返回字典

您应该在<代码>轨道>序列化< /代码>之后删除括号(并考虑将属性重命名为<代码>轨道>序列化< /COD>以避免混淆)或删除<代码> @属性< /COD>装饰器.< /P>



乍一看,在测试中,您似乎创建了一个新的播放列表,其中只有一个标题,与任何曲目都没有关系。因此,它当然无法断言与实际轨迹值(业力警察等)。此外,utils.py中的add_playlist()函数已经将播放列表添加到db.session并提交,因此单元测试可能不应该重复这些步骤?我看到您将辅助表命名为“tracks”。这可能与为轨迹模型指定的自动表格名称冲突。我建议您将此表重命名为“playlist\u tracks”(\u是辅助表名称的一种约定)。谢谢,但仍然存在一个问题:
self.assertEqual(playlist.tracks,track.serialize())断言错误:[]!={'id':1,'title':'Karma Police','artis[466 chars]None}
。我是否应该编辑我的问题或提出另一个问题以解决此问题?我猜在测试中未解决的辅助表仍然存在错误。您应该将此结果视为一个新问题,因此您至少应该在发布新问题之前尝试解决它。我认为user@peekay评论的内容是相关的,测试中可能缺少播放列表.tracks.append(track)。