Ruby可以向Number类和其他核心类型添加方法以获得如下效果:
1.should_equal(1)
Run Code Online (Sandbox Code Playgroud)
但似乎Python无法做到这一点.这是真的?如果是这样,为什么?是否与类型无法修改的事实有关?
更新:我不想谈论猴子修补的不同定义,而是只关注上面的例子.我已经得出结论,由于你们中的一些人已经回答,所以无法做到.但我想更详细地解释为什么不能这样做,也许如果Python中有什么功能可以允许这样做.
回答你们中的一些人:我可能想要这样做的原因只是美学/可读性.
item.price.should_equal(19.99)
Run Code Online (Sandbox Code Playgroud)
这更像是英语,并清楚地表明哪个是测试值,哪个是预期值,如下所示:
should_equal(item.price, 19.99)
Run Code Online (Sandbox Code Playgroud)
这个概念就是Rspec和其他一些Ruby框架所基于的.
ruby python programming-languages fluent-interface monkeypatching
我需要测试使用的功能datetime.datetime.now().最简单的方法是什么?
我有以下内容:
from datetime import datetime
def get_report_month_key():
month_for_report = datetime.utcnow()
return month_for_report.strftime("%Y%m")
Run Code Online (Sandbox Code Playgroud)
如何模拟datetime.utcnow()以便我可以在此函数上编写单元测试?
试着读这一个,但我无法得到它的工作对我来说在utcnow()
我正在跟踪在一周中的某一天(例如,该月的第一个星期日,该月的第三个星期五)重现的事件.我有一个DayOfWeek模型,用于存储活动的一周中的某一天.它包含一个方法next_day_of_week,用于将日期对象集返回到给定事件实例设置为的任何工作日的下一次出现(这有助于确定下一次出现事件的时间).
例如,2011年7月7日星期日:
等等.我正在编写单元测试(我有史以来第一次;我提到过我对这些东西很新吗?)并且试图围绕如何测试这种方法.我知道我需要嘲笑一些东西,但我不太清楚是什么.这个问题似乎得到了我的要求:Python:试图模拟datetime.date.today()但不工作
所以我尝试在tests.py中模拟出datetime.date:
class FakeDate(date):
"A fake replacement for date that can be mocked for testing."
def __new__(cls, *args, **kwargs):
return date.__new__(date, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我创建了我的测试用例,在模拟类中修补并设置为今天7/3/2011:
class TestDayOfWeek(TestCase):
"""Test the day of the week functions."""
@mock.patch('datetime.date', FakeDate)
def test_valid_my_next_day_of_week_sameday(self):
from datetime import date
FakeDate.today = classmethod(lambda cls: date(2011, 7, 3)) # July 3, 2011 is a Sunday
new_day_of_week = DayOfWeek.objects.create()
new_day_of_week.day = "SU"
self.assertEquals(new_day_of_week.my_next_day_of_week(), date(2011, 7, 3))
Run Code Online (Sandbox Code Playgroud)
供参考,这是模型类:
class DayOfWeek(ModelBase):
"""
Represents a day of the …Run Code Online (Sandbox Code Playgroud) 在我的一些测试中,由于时间和时区问题,我遇到了Travis失败的问题,所以我想模拟系统时间进行测试.我怎样才能做到这一点?
@pytest.mark.parametrize("test_input,expected_output", data)
def test_send_email(test_input, expected_output):
emails = SendEmails(email_client=MagicMock())
emails.send_email = MagicMock()
emails.send_new_email(*test_input)
emails.send_email.assert_called_with(*expected_output)
Run Code Online (Sandbox Code Playgroud)
我正在寻找模拟在 send_new_email 方法中调用的 datetime.datetime.now() 。不过我不确定该怎么做。
我尝试创建一个新的日期时间对象
datetime_object = datetime.datetime.strptime('Jun 1 2017 1:33PM',
'%b %d %Y %I:%M%p')
Run Code Online (Sandbox Code Playgroud)
然后覆盖 datetime.datetime.now
datetime.datetime.now = MagicMock(return_value=datetime_object)
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误
类型错误:无法设置内置/扩展类型“datetime.datetime”的属性
这个问题被标记为 Python 的重复:尝试模拟 datetime.date.today() 但不起作用
Python:尝试模拟 datetime.date.today() 但不起作用
我已经尝试过这个解决方案,但无法让它发挥作用。由于项目要求,我无法安装 freezegun。
我在测试文件中创建了一个新类
class NewDate(datetime.date):
@classmethod
def today(cls):
return cls(2010, 1, 1)
datetime.date = NewDate
Run Code Online (Sandbox Code Playgroud)
但我不知道如何让 SendEmails 类使用它。
我正在编写一个利用当前时间的应用程序(通过datetime.datetime.now())
出于调试目的,有没有办法覆盖此调用,以便它返回特定的时间戳?
作为后备方案,我可以编写一个函数,该函数将被调用datetime.datetime.now(),而不是返回所需的任何内容(生产中的实际当前时间和调试时所需的测试时间),但可能有一种更Pythonic的方式来执行这些操作?
我有以下类和方法:
class DateTimeHelper(object):
@staticmethod
def get_utc_millisecond_timestamp():
(dt, micro) = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f').split('.')
return "%s.%03d" % (dt, int(micro) / 1000) # UTC time with millisecond
Run Code Online (Sandbox Code Playgroud)
我怎样才能对它进行单元测试?虽然这很简单但我完全被难倒了.这是我的第一次单元测试.
我有一个 Django 测试,我需要模拟 datetime.now(),因为它测试的视图使用 datetime.now()
\n\n我正在使用 Michael Foord 的模拟库,版本 1.0.1。
\n我正在寻找一种不使用其他库(例如 freezegun)的解决方案。
大多数例子都是这样的,这个导入 datetime 并覆盖它,但我正在导入 datetime.datetime 并尝试覆盖它,由于某种原因,这不起作用。
\n\n覆盖日期时间的工作原理:
\n\nimport mock\nimport datetime\n\nclass FixedDate(datetime.datetime):\n\n @classmethod\n def now(cls):\n return cls(2010, 1, 1)\n\n@mock.patch(\'datetime.datetime\', FixedDate)\ndef myTest():\n print(datetime.datetime.now())\n\nmyTest()\nRun Code Online (Sandbox Code Playgroud)\n\n但我想导入 datetime.datetime 并执行以下操作:
\n\nimport mock\nfrom datetime import datetime\n\nclass FixedDate(datetime):\n\n @classmethod\n def now(cls):\n return cls(2010, 1, 1)\n\n@mock.patch(\'datetime\', FixedDate)\ndef myTest():\n print(datetime.now())\n\nmyTest()\nRun Code Online (Sandbox Code Playgroud)\n\n这会导致 TypeError: Need a valid target to patch. 您提供了:“日期时间”。
\n\n模拟库还指出:
\n\n\ntarget 应该是 \xe2\x80\x98package.module.ClassName\xe2\x80\x99 形式的字符串。目标被导入,指定的对象被新对象替换,因此目标必须可以从您调用补丁的环境中导入。
\n …
我正在对 python 脚本进行单元测试,并希望模拟该脚本在一个月的不同日期的运行。
有什么方法可以设置从命令行启动脚本的日期/时间?
我无权更改系统日期/时间,并且不想使用我想要测试的日期来破解脚本。
干杯,多纳尔
为什么 Pytest 返回集合错误“在 test_billing_month_year:函数不使用参数“日期”,即使使用并定义了日期?
billing_month_year() 函数仅返回当前日期的上个月和上一年。
import datetime as dt
import pytest
from mock import patch
def billing_month_year():
today = dt.datetime.utcnow()
#last month from current date
last_month = today.month - 1 if today.month>1 else 12
#last year from current date
last_month_year = today.year if today.month > last_month else today.year - 1
return last_month, last_month_year
@pytest.mark.parametrize(
'date, expected',
[
#last month in previous year
(dt.datetime(year=2020, month=1, day=21), (12, 2019)),
#last month in current year
(dt.datetime(year=2020, month=2, day=21), (01, 2020)),
]
) …Run Code Online (Sandbox Code Playgroud) python ×11
datetime ×5
unit-testing ×4
pytest ×3
django ×2
mocking ×2
linux ×1
python-mock ×1
ruby ×1
time ×1