我尝试为我的烧瓶应用程序测试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
答案 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))