Bri*_*ian 2 python datetime unit-testing django-serializer django-rest-framework
我有一个正在单元测试的网络应用程序。我正在尝试测试 drf 序列化器,但序列化器更改了日期时间的格式,因此格式不同的相同日期无法通过测试,因为它们不相同。
我尝试格式化序列化器 timeDateField,但它们使用的所有 strftime 格式都是零填充的,并且我的测试用户上次登录属性给出的日期没有零填充。我认为该解决方案可以按照所选答案在此处描述的方式来解决,但这似乎有点粗略,理想情况下,我作为必须维护此代码的人,想要一个更干净或更Pythonic的解决方案。
这是测试:
class UserTest(TestCase):
def setup(self):
last_login = datetime.datetime(2000, 1, 1, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
date_joined = datetime.datetime(2019, 2, 2, hour=2, minute=2, second=2, microsecond=2, tzinfo=None)
birthdate = timezone.now().date()
renewal = timezone.now().date()
return User.objects.create(username='test_user', first_name='test_first', last_name='test_last',
email='test_mail', last_login=last_login, date_joined=date_joined,
birthdate=birthdate, gender='U', renewal=renewal)
def test_user_serializer(self):
self.u = self.setup()
serializer = UserSerializer(self.u, many=False)
data = serializer.data
.....
# tests for serialized attributes
self.assertEquals((data['last_login']), self.u.last_login) # FAILING THE TEST
Run Code Online (Sandbox Code Playgroud)
这是用户序列化器:
class UserSerializer(serializers.ModelSerializer):
last_login = serializers.DateTimeField
date_joined = serializers.DateTimeField
birthdate = serializers.DateField
renewal = serializers.DateField
class Meta:
model = User
fields = ('__all__')
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误:
self.assertEquals(data['last_login'], self.u.last_login)
AssertionError: '2000-01-01T00:00:00Z' != datetime.datetime(2000, 1, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)
在模型中,last_login 属性是 dateTimeField。
我是否应该尝试更改正在测试的元素之一的格式,或者是否有办法编写一个测试来比较日期而不考虑格式?
请指教。谢谢。
最简单的方法是:
assert response.json()["created_at"] == serializers.DateTimeField().to_representation(instance.created_at)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1649 次 |
| 最近记录: |