Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python测试对时间敏感的应用程序_Python_Django_Unit Testing_Datetime - Fatal编程技术网

用Python测试对时间敏感的应用程序

用Python测试对时间敏感的应用程序,python,django,unit-testing,datetime,Python,Django,Unit Testing,Datetime,我在Django写了一个拍卖系统。我想编写单元测试,但应用程序是时间敏感的(例如,广告商收取的费用取决于他们的广告在网站上活跃的时间长短)。测试这类应用程序的好方法是什么 这里有一个可能的解决方案:a,它提供了一些方法来生成测试中的可预测日期和生产中的实时值。您对这种方法有什么想法吗,或者您在实践中尝试过其他方法吗?在您提供的链接中,作者有点拒绝为了单元测试而向方法添加额外参数的想法,但在某些情况下,我认为您可以将此作为业务逻辑的扩展。在我看来,这是一种控制反转的形式,可以使您的模型更灵活,甚至

我在Django写了一个拍卖系统。我想编写单元测试,但应用程序是时间敏感的(例如,广告商收取的费用取决于他们的广告在网站上活跃的时间长短)。测试这类应用程序的好方法是什么


这里有一个可能的解决方案:a,它提供了一些方法来生成测试中的可预测日期和生产中的实时值。您对这种方法有什么想法吗,或者您在实践中尝试过其他方法吗?

在您提供的链接中,作者有点拒绝为了单元测试而向方法添加额外参数的想法,但在某些情况下,我认为您可以将此作为业务逻辑的扩展。在我看来,这是一种控制反转的形式,可以使您的模型更灵活,甚至更具表现力。例如:

def is_expired(self, check_date=None):
    _check_date = check_date or datetime.utcnow()
    return self.create_date + timedelta(days=15) < _check_date
def已过期(self,check\u date=None):
_check\u date=check\u date或datetime.utcnow()
返回self.create\u date+timedelta(天数=15)<\u check\u date
基本上,这允许我的单元测试提供自己的日期/时间来验证我的逻辑


引用的博客中的论点似乎是,这会破坏API。然而,我遇到过这样的情况:生产用例要求用一个替代值替换当前日期/时间。换言之,控制反转方法最终成为我应用程序的必要部分

一般来说,我尝试让生产代码将日期对象作为输入(在语义允许的情况下)。在许多测试情况下,您描述的DateFactory就是人们所做的

在Python中,您还可以直接更改静态模块方法Datetime.now或Time.now。在测试的拆卸部分,您需要小心替换它们。当您无法(或很难)更改正在测试的类时,这尤其有用

要做到这一点,你必须

   def setUp(self) 
      self.oldNow = Datetime.now
      Datetime.now = self._fakenow
      ...

   def tearDown(self)
      Datetime.now = self.oldNow
如果设置方法有一点点可能失败,我会最后进行替换

在许多情况下,使用自定义DateFactory更安全,尤其是当您担心人们忘记拆卸部分时