下面是一个小类(在myapp/getters.py中):
from django.contrib.auth.models import User
class UserGetter:
def get_user(self):
return User.objects.get(username='username')
我想模拟对User.objects.get的调用,返回一个MagicMock,并测试该方法是否返回我注入的内容。在myapp/tests/tests_getters.py中
from unittest import TestCase
from d
我正在使用Python2.7中的Mock ()库。我有一个主函数,它调用了一些我正在尝试测试的其他函数。
它调用的其他函数是其他实例方法(例如,def _other_function(self, a, b) )。
我调用我的主要功能,我有其他的功能,它称为修补。我刚将autospec=True添加到修补程序中。但是,当我检查调用参数时,它会显示一个self参数(如预期的那样):
python2.7> _other_function_mock.call_args_list
[call(<some.module.class.method object at 0x9acab90>,
我正在与Python一起使用,并想知道这两种方法中哪一种更好(阅读:更多的pythonic)。
方法one:只需创建一个模拟对象并使用它。代码看起来像:
def test_one (self):
mock = Mock()
mock.method.return_value = True
self.sut.something(mock) # This should called mock.method and checks the result.
self.assertTrue(mock.method.called)
方法2:使用修补程序创建模拟。代码看起来像
为了重新创建方法的签名,我尝试使用create_autospec。我发现这个功能不像我想的那样工作。如果create_autospec函数由于某些原因不能创建规范,而不是没有完全约束该函数,那么我就足以引发异常。我目前的解决方法是修改unittest.mock模块中的源代码,但是这个解决方案并不满足我的需求。在无法获得签名的情况下,是否有适当的'pythonic‘方法使create_autospec失败?我也想避免包装模块。我正在使用Python3.5.2。
from inspect import signature
from unittest.mock import create_a
我有一个在python中使用googleads库的服务,我想对这些函数进行单元测试,但不知道如何模拟这个方面。当我使用PHP和时,可以很容易地模拟客户机,因为我可以知道应该调用什么,也可以模拟返回什么,但我不知道如何在这里这样做。
你能指出一个好的资源来更多地了解它吗?下面是一些我想测试的示例代码(get_account_timezone):
from googleads import AdWordsClient
from googleads.oauth2 import GoogleRefreshTokenClient
from dateutil import tz
class AdWord
我使用的是python mock库(python2.7,mock==1.0.1),当我模拟出我正在测试的代码的某些部分时,由于某种原因,mock会吞噬异常。
下面是一个示例:
#test.py
from django import test
from something import main_func
class TestCase(test.TestCase):
@mock.patch('something.somewhere')
def test_something(mock_somewhere):
main_func()
#something.py
d
我使用flask_restful创建了我的API之一。名为TotalUserResponse的资源或API类有一个名为process_get_request的方法,我正在尝试对其进行统一测试。
def process_get_request(self):
params = parser_get.parse_args()
user_id = params.get('user_id')
if not user_id:
raise ValueError("User id is empty")
user = sessio
我在模拟对象的方法时尝试使用autospec=True时遇到错误。我将写一个简单的例子,展示如何重现我得到的错误。假设我有一个非常简单的类,如下所示: class SimpleClass:
def target_method(self, a, b):
return a + b 现在,在我的系统的不同部分中,我有一个通过执行print(obj.target_method(a, b))与SimpleClass实例交互的函数,我必须统一测试这个函数。我想通过用autospec=True模拟target_method来测试它,以确保方法签名,并检查它是否按预期调用。当我得到
如何使用python中的另一个函数来模拟一个函数,该函数还将提供一个模拟对象?
我有这样的代码:
def foo(arg1, arg2):
r = bar(arg1)
# does interesting things
我想替换bar函数的一个实现,让它返回正常的值,并确保用正确的参数调用它。
我尝试过这样做,其中fake_bar是我对bar的简单替代品
from unittest.mock import patch
def test_foo():
with patch("x.bar", fake_bar) as mock_bar:
actu
我开始使用pathlib,并且非常喜欢在大多数情况下使用它。我遇到的问题是由于方法而不是函数的性质而导致的测试。
def test_correct_dir_was_made(self):
with patch('my.module.Path.mkdir') as mock_mkdir:
check_dirs()
mock_mkdir.assert_called_once()
在check_dirs函数中,动态生成一个路径,如果它不存在,就创建它。我知道如何确保它被任意调用,但我的问题是,我不确定如何捕获传递到Path.mkdir中的sel
我在试着测试python类。我想嘲笑一些类的方法,但不是所有的方法。使用mock.patch可以很好地实现这一点。我的问题是:
有许多函数要修补,因此这意味着许多嵌套调用要修补。
有许多测试,由于补丁的作用域性质,这意味着我需要在每个测试上进行修补(对于这个类有很多测试需要相同的补丁)。
有什么干净的解决办法吗?
为了给出更多的颜色,下面是一个例子:
# test_me.py
class ClassUnderTest:
# All foo functions should be mocked
def foo1(self):
pass
问题
使用mock.patch和autospec=True对类进行修补并不能保留该类实例的属性。
The Details
我正在尝试测试一个类Bar,它将类Foo的实例实例化为名为foo的Bar对象属性。正在测试的Bar方法称为bar;它调用属于Bar的Foo实例的方法foo。在测试时,我是在模仿Foo,因为我只想测试Bar是否访问了正确的Foo成员:
import unittest
from mock import patch
class Foo(object):
def __init__(self):
self.foo = 'foo'
class
我的理解是,autospec在这里使用的最简单的形式将检查正在被模仿的函数的签名。它的目的是如果它们不匹配,就会产生错误。在下面的代码中,它似乎注入了一个额外的参数--对象本身。为什么使用模拟模块的autospec会导致这里显示的意外行为?对于这个问题,我在模块simplebutton中创建了一个简化版本。当它作为主模块运行时,一行“这不是玩笑”被打印出来。
#module simplebutton
import sys
class _Dialog2:
def callback(self):
print("It's no joke")
d
我有一个循环看起来是这样的:
for i in range(len(some_list)):
response = requests.post(some_url, some_params)
if response.status_code != HTTPOk:
# do something
我想做的是在循环的第二次迭代中更改requests.post的响应。从我的测试中,我知道我可以做这样的事情:
mock_response = mock.Mock()
mock_response.status_code = 404
with mock.patch(mymodule.
我在管理器中有一个方法,这个方法调用从不同模块导入的函数,现在我正在尝试编写一个测试,以确保在manager方法执行时调用该函数。我尝试过一些方法--它不起作用--这里是代码示例。提示:我用pytest做发情器
from unittest import mock
# Customer Manager class
class ItemsManager(models.Manager):
def bulk_update(self, *args, **kwargs):
result = super().bulk_update(*args, **kwargs)
我很难理解如何编写Python 3单元测试,该测试使用模拟对象来模拟Django模型的实例方法。下面是我的模型和测试:
# models.py
class Author(models.Model):
name = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, related_name='books')
def retriev
我有一个关于Python、unittest.mock.Mock和spec_set功能的问题。
我的目标是创建一个具有以下功能的模拟:
它有一个任意类的规范,我在创建时决定。,我必须能够根据第1点的规范在模拟的属性或方法上赋值。在以下情况下,mock必须引发AttributeError:,我尝试分配一个不在spec <code>H 111</code>中的属性,我调用或检索spec_set中缺少的属性,或者在spec_set中存在但根据上面的代码分配的属性。
一些我想要的行为的例子:
class MyClass:
property: int = 5
def f