模拟单元测试中时间的流逝

2024-03-22

我已经为客户构建了一个付费 CMS + 发票系统,我需要更加严格地进行测试。

我将所有数据保存在 Django ORM 中,并有一堆以不同时间间隔运行的 Celery 任务,以确保发送新发票和发票提醒,并在用户不支付发票时切断访问权限。

例如,我希望能够运行以下测试:

  1. 创建新用户并生成 X 天网站访问权限的发票

  2. 模拟 X + 1 天的过去,并运行我在 Celery 中设置的所有任务。

  3. 检查是否已向用户开具了另外 X 天的新发票。

到目前为止,我提出的 KISS 方法是在单独的机器上进行所有测试,并在操作系统级别实际操作日期/时间。所以测试脚本将:

  1. 将系统日期设置为第一天

  2. 创建新用户并生成 X 天访问权限的第一张发票

  3. 比系统日期提前 1 天。运行我所有的芹菜任务。重复直到 X + 1 天“过去”

  4. 检查是否已开具新发票

这有点笨拙,但我认为它可能有用。关于如何完成它还有其他想法吗?


您可以使用mock http://www.voidspace.org.uk/python/mock/更改用于获取时间的函数的返回值(datetime.datetime.now例如)。

有多种方法可以做到这一点(请参阅模拟文档),但这是一种:

import unittest
import datetime
from mock import patch

class SomeTestCase(unittest.TestCase):
    def setUp(self):
        self.time = datetime.datetime(2012, 5, 18)
        class fakedatetime(datetime.datetime):
            @classmethod
            def now(cls):
                return self.time
        patcher = patch('datetime.datetime', fakedatetime)
        self.addCleanup(patcher.stop)
        patcher.start()

    def test_something(self):
        self.assertEqual(datetime.datetime.now(), datetime.datetime(2012, 5, 18))
        self.time = datetime.datetime(2012, 5, 20)
        self.assertEqual(datetime.datetime.now(), datetime.datetime(2012, 5, 20))

因为我们不能直接替换datetime.datetime.now,我们创建一个假的日期时间类,它以相同的方式执行所有操作,除了在调用 now 时返回一个常量值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟单元测试中时间的流逝 的相关文章

  • Flask中使用的路由装饰器是如何工作的

    我熟悉 Python 装饰器的基础知识 但是我不明白这个用于 Flask 路由的特定装饰器是如何工作的 以下是 Flask 网站上的代码片段 from flask import Flask escape request app Flask
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • 将 yerr/xerr 绘制为阴影区域而不是误差线

    在 matplotlib 中 如何将误差绘制为阴影区域而不是误差条 例如 而不是 忽略示例图中各点之间的平滑插值 这需要进行一些手动插值 或者只是获得更高分辨率的数据 您可以使用pyplot fill between https matpl
  • 从字典的元素创建 Pandas 数据框

    我正在尝试从字典创建一个 pandas 数据框 字典设置为 nvalues y1 1 2 3 4 y2 5 6 7 8 y3 a b c d 我希望数据框仅包含 y1 and y2 到目前为止我可以使用 df pd DataFrame fr
  • 指示电子邮件的类型

    我有以下自动化程序 它将电子邮件发送给我自己 并添加了特定的链接 import win32com client as win32 import easygui import tkinter as to from tkinter import
  • 如何使用 Python boto3 获取 redshift 中的列名称

    我想使用 python boto3 获取 redshift 中的列名称 创建Redshift集群 将数据插入其中 配置的机密管理器 配置 SageMaker 笔记本 打开Jupyter Notebook写入以下代码 import boto3
  • 从 pyspark.sql 中的列表创建数据框

    我完全陷入了有线的境地 现在我有一个清单li li example data map lambda x get labeled prediction w x collect print li type li 输出就像 0 0 59 0 0
  • 将 pandas 剪切操作转换为常规字符串

    我明白了 pandas cut 操作的输出 0 0 20 1 0 20 2 0 20 3 0 20 4 0 20 5 0 20 6 0 20 7 0 20 8 0 20 9 0 20 如何将 0 20 转换为 0 20 我正在这样做 str
  • python celery -A 的无效值无法加载应用程序

    我有一个以下项目目录 azima init py main py tasks py task py from main import app app task def add x y return x y app task def mul
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • 如何在 Python 中的函数入口、内部和退出处进行日志记录

    我希望能够使用 Python 日志记录工具在我的代码中进行简单且一致的日志记录 我能够执行以下操作 我希望所有现有 未来的模块和函数都有 输入 和 完成 日志消息 我不想添加相同的代码片段来定义日志记录参数 如下所示don t want t
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • NumPy 相当于 Keras 函数 utils.to_categorical

    我有一个使用 Keras 进行机器学习的 Python 脚本 我正在构建 X 和 Y 它们分别是特征和标签 标签的构建方式如下 def main depth 10 nclass 101 skip True output True video
  • pygame:使用 sprite.RenderPlain 绘制精灵组的顺序

    我有一个精灵组 需要按一定的顺序绘制 以便其精灵按应有的方式重叠 然而 即使使用运算符模块函数 sorted self sprites key attrgetter y x 对组进行排序 顺序也是错误的 我该如何解决这个问题 直截了当地说
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic

随机推荐

  • Kubernetes:使用 kubectl 修改机密?

    如何修改 Kubernetes 中的值secret using kubectl 我用以下方法创建了这个秘密kubernetes create secret generic 但似乎没有办法修改秘密 例如 向其中添加新的秘密值 或者更改其中的秘
  • std::包含自身的容器的变体

    我有一个二进制格式 我正在为其编写编码器和解码器 几乎所有二进制类型都直接映射到基元 除了两种容器类型 列表和映射类型 之外 它们可以包含格式中的任何其他类型 包括它们本身 这些感觉就像他们只是想成为一个 typedefstd varian
  • 如何以编程方式启用 Visual Studio 扩展

    我创建了一个 Visual Studio 扩展并将其打包在 Visual Studio 安装程序中 现在 当我安装安装程序时 vsix 已安装 并且也可以在扩展管理器窗口中看到 但处于禁用状态 我尝试过为扩展添加注册表项等方法 但同样没有用
  • 在 64 位 Python 上使用 sys.platform=='win32' 检查是否安全?

    区分在 Windows 和其他操作系统 通常是 Linux 上运行的 Python 应用程序的通常检查是使用条件 if sys platform win32 但我想知道在过去几年64位Python得到更广泛使用的今天使用安全吗 32 真的意
  • 计算列的时间总和

    我有这张表 table border 1 width 100 tbody tr td Total duration time td td class total duration time td tr tbody table table b
  • 将 Chrome 开发控制台转储到文本文件?

    有时 当我尝试调试用户在使用我的 Chrome 扩展程序 StayFocusd 时遇到的问题时 访问控制台日志会很有用 现在我只是要求他们将日志复制并粘贴给我 但如果我能够以编程方式生成一个文件 他们可以通过电子邮件发送给我 那就更好了 那
  • 函数指针的函数模板专业化

    我有一个清理函数 我只想在 传统 指针类型上运行 我的问题是函数模板 我可以将函数限制为仅指针 但是由于函数指针和常规指针之间的转换规则差异 我遇到了问题 The Sanitize 函数需要针对大量类型运行 其中一些是指针 需要进行清理 其
  • 上传文件 spring boot 所需的请求部分“文件”不存在

    我想为我的 Spring Boot 应用程序添加上传功能 这是我的上传休息控制器 package org sid web import java io BufferedOutputStream import java io File imp
  • 使用 numpy 数组左移大量数字

    Python确实可以左移一位大整数 1L lt lt 100 1267650600228229401496703205376L 但 NumPy 似乎有一个问题 a np array 1 2 100 output np left shift
  • 复制大文件时如何避免 StorageFile.CopyAsync() 抛出异常?

    我将通过以下方式将一些文件从视频库复制到我的应用程序存储StorageFile CopyAsync 方法 但如果文件大小超过1GB 则会抛出异常 如下所示 类型 System Runtime InteropServices COMExcep
  • 如何以编程方式在 Android 中加入 2 个联系人?

    我需要知道是否可以加入两个或多个联系人 以编程方式 使用联系人 android API 或其他方式 例如 我有一个联系人 Axel Rose 有一个电子邮件帐户和电话号码 我注意到一些应用程序 如 Whatsapp Facebook 和 S
  • 如何更改物料表操作字段图标

    actions icon edit tooltip Edit User onClick event rowData gt alert You are editing rowData name icon delete tooltip Dele
  • 从物化路径构建 JSON 树

    我计划在 MongoDB 中使用物化路径来表示树 并且需要将物化路径转换回 JSON 树 前任 物化路径 var input id 0 path javascript id 1 path javascript database id 2 p
  • 将本地 TIMESTAMP 转换为 UTC 时间

    我有两张带有时间戳的表 TABLE1带有当地时间的 TIMESTAMP TABLE2带有 UTC 时间戳 我需要做类似的事情 select count from TABLE1 where TIME STAMP gt TABLE2 TIME
  • 我可以从打开的文件中读取新数据而不重新打开它吗?

    考虑有一个文件test txt其中有一些随机文本 现在我们运行以下代码 f open test txt r f read 现在我们将数据附加到test txt来自其他一些进程 有没有办法不用重新打开f我们可以read新数据 这个问题仅限于P
  • 我如何使用 ie6 测试我的网站

    我在最新的 Firefox 中开发了一个网站 然后在一台只有 ie6 的机器上展示了它 看起来很糟糕 无论如何 我可以测试它在 IE6 中的外观 而无需实际下载 我看到ie8有一个兼容模式 以显示它在ie7中的样子 ie 6有类似的东西吗
  • Cassandra 0.8 = 提供什么样的“行计数”功能?

    同时支持 Cassandra 中的 行计数 在 CF 中 a 随机分区器 b OrderPreservingPartitioner http www datastax com dev blog whats new in cassandra
  • 如何删除 TextBox 控件的默认上下文菜单? C#

    如何删除默认的上下文菜单TextBox控制 有属性可以禁用它吗 谢谢 您还可以设置ShortcutsEnabled财产给false 这将删除默认的上下文菜单和所有剪贴板功能 我想这就是你试图抑制菜单的原因 除了故意阻止用户使用复制 粘贴之外
  • C++:使用 CRTP,派生类中定义的类无法在基类中访问

    这是 简化的 基类 template
  • 模拟单元测试中时间的流逝

    我已经为客户构建了一个付费 CMS 发票系统 我需要更加严格地进行测试 我将所有数据保存在 Django ORM 中 并有一堆以不同时间间隔运行的 Celery 任务 以确保发送新发票和发票提醒 并在用户不支付发票时切断访问权限 例如 我希