【问题标题】:Unit Testing Django Model Save Function单元测试 Django 模型保存功能
【发布时间】:2018-08-05 22:46:20
【问题描述】:

我正在创建测试以检查自定义校准模型保存功能是否会更新资产记录(外键),如果它是资产的最新校准记录。保存功能在实时开发和生产服务器甚至在 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(),但似乎仍然失败。

【问题讨论】:

    标签: django django-models python-unittest django-testing django-unittest


    【解决方案1】:

    解决了!

    自定义保存功能正确更新数据库,但不是正在测试的模型实例!需要刷新模型实例以获取任何更新,方法是使用[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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2017-05-23
      • 2013-09-11
      • 2021-09-07
      • 1970-01-01
      • 2021-10-13
      • 2016-01-27
      相关资源
      最近更新 更多