我正在创建测试,以检查自定义的校准模型保存函数是否更新资产记录(外键),如果它是资产的最新校准记录。在live & production中,甚至在django shell中,保存函数的执行情况与预期完全相同,但在测试过程中似乎失败了.
models.py
class Asset(models.Model):
...
requires_calibration = models.BooleanField()
passed_calibration = models.BooleanField(default=False)
calibration_date_prev = models.DateField(null=True, blank=True)
calibration_date_next = models.DateField(null=True, blank=True)
class CalibrationRecord(models.Model):
calibration_record_id = models.AutoField(primary_key=True)
asset = models.ForeignKey(
"myapp.Asset",
on_delete=models.CASCADE,
limit_choices_to={"requires_calibration": True}
)
calibration_date = models.DateField(default=timezone.now)
calibration_date_next = models.DateField(null=True, blank=True)
calibration_outcome = models.CharField(max_length=10, default="Pass")
def save(self, *args, **kwargs):
super(CalibrationRecord, self).save(*args, **kwargs)
# Check if this is the latest calibration record for any asset, if so update asset.calibration_dates and status
latest_asset_calibration = CalibrationRecord.objects.filter(asset=self.asset.pk).order_by(
"-calibration_date", "-calibration_record_id")[0]
if self.pk == latest_asset_calibration.pk:
Asset.objects.filter(pk=self.asset.pk).update(calibration_date_prev=self.calibration_date)
if self.calibration_date_next:
Asset.objects.filter(pk=self.asset.pk).update(calibration_date_next=self.calibration_date_next)
else:
Asset.objects.filter(pk=self.asset.pk).update(calibration_date_next=None)
if self.calibration_outcome == "Pass":
Asset.objects.filter(pk=self.asset.pk).update(passed_calibration=True)
else:
Asset.objects.filter(pk=self.asset.pk).update(passed_calibration=False)tests_models.py示例失败测试
class CalibrationRecordTests(TestCase):
def test_calibration_record_updates_asset_cal_date_prev(self):
"""
All calibration records should update related Asset record's "calibration_date_prev" to calibration_date
"""
asset1 = Asset.objects.create(asset_description="Test Asset 2", requires_calibration=True)
self.assertIsNone(asset1.calibration_date_prev)
cal = CalibrationRecord.objects.create(asset=asset1, calibration_description="Test Calibration 2", calibration_date=timezone.now())
self.assertEqual(cal.calibration_date, asset1.calibration_date_prev)错误日志
======================================================================
FAIL: test_calibration_record_updates_asset_cal_date_prev (assetregister.tests_models.CalibrationRecordTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\[path]\app\tests_models.py", line 159, in test_calibration_record_updates_asset_cal_date_prev
self.assertEqual(cal.calibration_date, asset1.calibration_date_prev)
AssertionError: datetime.datetime(2018, 2, 26, 12, 26, 34, 457513, tzinfo=<UTC>) != None
======================================================================我所有有关自定义校准记录保存功能的测试似乎都失败了,因为相关的资产记录在应该更新时没有更新。
有什么想法吗?为什么这在开发和生产过程中起作用,而不是在测试过程中呢?
尽管.create()方法应该在创建校准记录后自动执行.save(),但我甚至尝试在创建校准记录之后执行手动.save(),但它似乎仍然失败。
发布于 2022-04-21 19:33:43
如果您发现自己在这里,最好用Model.refresh_from_db(using=None, fields=None)重新加载对象。见Django文档
还签出了从数据库重新加载django对象
发布于 2018-02-27 10:59:33
解决了!
自定义保存函数正确更新数据库,但没有测试模型实例!需要刷新模型实例以获得任何更新,方法是使用类似于[model].objects.get()的内容再次调用它
例如:
asset = Asset.objects.create(asset_description="Test Asset 2", requires_calibration=True)
self.assertIsNone(asset.calibration_date_prev)
CalibrationRecord.objects.create(asset=asset, calibration_description="Test Calibration 2",
calibration_date=timezone.now())
cal = CalibrationRecord.objects.get(calibration_description="Test Calibration 2")
asset = Asset.objects.get(asset_description="Test Asset 2")
self.assertEqual(cal.calibration_date, asset.calibration_date_prev)https://stackoverflow.com/questions/48989171
复制相似问题