Django+pytest路由测试报错:TypeError期望字符串或类字节对象
解决Django+pytest中的TypeError: expected string or bytes-like object问题
错误根源
- Fixture日期赋值错误:你在
newsfixture中给date字段赋值为datetime.today,这是一个方法对象而非实际的日期值。Django在处理这个字段时,会尝试将其解析为日期字符串,方法对象无法被解析,直接抛出TypeError。 - 测试变量引用错误:测试函数里生成URL时用了
news.id,但news并没有在函数参数中定义,应该使用参数args(args对应pytest.lazy_fixture('news')注入的实例)。
修复代码
1. 修正Fixture代码
@pytest.fixture def news(): news = News.objects.create( title='Новость', text='Невероятное событие', date=datetime.today(), # 加上括号调用方法,获取实际日期值 ) return news
2. 修正测试代码
@pytest.mark.django_db @pytest.mark.parametrize( 'name, args', ( ('news:detail', pytest.lazy_fixture('news')), ('news:home', None), ('users:login', None), ('users:logout', None), ('users:signup', None), ) ) def test_pages_availability(client, name, args): if args is not None: url = reverse(name, args=(args.id,)) # 使用args参数获取news实例的id else: url = reverse(name) response = client.get(url) assert response.status_code == HTTPStatus.OK
验证修复
修复后重新运行测试,两个问题均被解决:
- Fixture生成合法的日期值存入数据库,Django可正常解析
- 测试函数能正确获取news实例的id,生成有效URL并成功访问页面
内容的提问来源于stack exchange,提问作者Vladimir Shevchenko
相关产品推荐
相关产品推荐

