AttributeError:' NoneType'对象没有属性'数据'

时间:2015-02-26 13:33:15

标签: python flask flask-migrate

我尝试为我的烧瓶应用程序测试friend route,但收到错误:

AttributeError: 'NoneType' object has no attribute 'data'

我可以测试模型但是当我想测试烧瓶时('你现在是朋友')我得到上面的错误。

我不是烧瓶测试的专家。

你能告诉我出了什么问题吗?我该如何解决?

view.py:

@layout.route('/friend/<name>')
@login_required
def friend(name):
        user = Users.query.filter_by(name = name).first()
        if user == g.user:
            flash('You can\'t Friend yourself!')
            return redirect(url_for('layout.user',page=1,sortby='normal'))
        u = g.user.be_friend(user)
        if u is None:
            flash('You have been Friend with ' + name + '.')
            return redirect(url_for('layout.user',page=1,sortby='normal'))
       db.session.add(u)
       db.session.commit()
       flash('You are now Friend with ' + name + '!')
       return redirect(url_for('layout.user', page=1,sortby='normal'))

test.py:

 def test_friend(self):
        u1 = Users(name='monk1', email='monk1@example.com', age=25)
        u2 = Users(name='monk2', email='monk2@example.com', age=27)
        db.session.add(u1)
        db.session.add(u2)
        db.session.commit()
        response = self.assertTrue(u1.be_friend(u2))
        self.assertTrue('You have been Friend with monk2', response.data)
# I got error Here if I comment this line the test whole model.py works well But Now I want to test flash too that I get the mentioned error

2 个答案:

答案 0 :(得分:3)

当你这样做时

self.assertTrue('You have been Friend with monk2', response.data)

上一步骤中的响应值已设置为None,因为response = self.assertTrue(u1.be_friend(u2))的结果为None。如果条件未满足,assertTrue将引发错误,因此不会返回任何内容作为其输出,因此response的值为None

由于None没有任何名为data的属性,因此会抛出错误。

答案 1 :(得分:0)

您的问题出在be_friend方法:

def be_friend(self, user): #follow
    if not self.are_friends(user):
        self.is_friend.append(user)
        user.is_friend.append(self)
        return self

在这里,如果两个用户都已经是朋友,则不返回任何内容(因此Python会自动返回None)。您可以通过将方法更改为:

来修复它
def be_friend(self, user): #follow
    if not self.are_friends(user):
        self.is_friend.append(user)
        user.is_friend.append(self)
    return self

此外,使用assertIsNotNone代替assertTrue可以帮助您捕获此错误。

您也无法将返回值指定为HTTP响应对象,因为您直接调用方法,而不是视图。您可以按如下方式重写测试:

self.assertIsNotNone(u1.be_friend(u2))
self.assertTrue(u1.are_friends(u2))