- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想模拟一个具有以下要求的类:
__init__()
方法中定义autospec=True
,因此类的 API 将严格检查调用一个简化的类示例:
class MyClass():
id = 0
def __init__(self, x=0.0, y=1.0):
self.x = x
self.y = y
self.id = MyClass._id
MyClass.id +=1
def calc_x_times_y(self):
return self.x*self.y
def calc_x_div_y(self, raise_if_y_not_zero=True):
try:
return self.x/self.y
except ZeroDivisionError:
if raise_if_y_not_zero:
raise ZeroDivisionError
else:
return float('nan')
就属性而言,我需要模拟对象的行为与原始对象相同:
x,y
属性但是 mock 方法调用应该被 mock 拦截,并验证其调用签名继续进行此操作的最佳方式是什么?
编辑
我已经尝试了几种方法,包括子类化 Mock
类,使用 attach_mock()
和 mock_add_spec()
,但总是遇到了死胡同。
我使用的是标准 mock图书馆。
最佳答案
由于没有收到任何答案,我将发布对我有用的方法(不一定是最好的方法,但这里有):
我创建了一个模拟工厂,它创建了一个 Mock()
对象,使用描述的语法设置它的 id
属性 here ,并返回对象:
class MyClassMockFactory():
_id = 0
def get_mock_object(self, *args,**kwargs):
mock = Mock(MyClass, autospec = True)
self._attach_mock_property(mock , 'x', kwargs['x'])
self._attach_mock_property(mock , 'y', kwargs['y'])
self._attach_mock_property(mock , 'id', MyClassMockFactory._id)
MyClassMockFactory._id += 1
return mock
def _attach_mock_property(self, mock_object, name, value):
p = PropertyMock(return_value=value)
setattr(type(mock_object), name, p)
现在,我可以为我的测试修补 MyClass()
构造函数:
class TestMyClass(TestCase):
mock_factory = MyClassMockFactory()
@patch('MyClass',side_effect=mock_factory.get_mock_object)
test_my_class(self,*args):
obj0 = MyClass()
obj1 = MyClass(1.0,2.2)
obj0.calc_x_times_y()
# Assertions
obj0.calc_x_times_y.assert_called_once_with()
self.assertEqaul(obj0.id, 0)
self.assertEqaul(obj1.id, 1)
关于python - 在 python 中使用 'autospec=True' 时模拟类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13549699/
/usr/local/bin/ruby -rrubygems -e "require 'redgreen'" /usr/local/lib/ruby/gems/1.8/gems/rspec-1.3.
我想断言 Python 类中的一个类方法使用一组特定的参数调用另一个类方法。我希望模拟的类方法是“规范的”,因此它会检测是否使用错误数量的参数调用它。 当我使用 patch.object(.., au
我有一个类,它使用@property 装饰器定义了一些属性。当我修补该类并设置 autospec=True 时,我希望该属性的行为符合规范 class MyClass(object): def
在使用 mock.patch 及其变体时,我什么时候应该使用 autospec=True? 一方面,this article警告我们始终使用 autospec=True: ... you should
我想知道这是否在 StackOverflow 上有它的位置,但由于它与编程相关,我会把它扔掉。 这是我的问题。我是 TDD 的新手,我喜欢 Ruby,所以我走的明显路径是用 rspec 测试东西。为什
图书馆模块: # mod.py def foo(): bar1("arg1") bar2("arg2x", "arg2y") def bar1(x): pass def bar
我已经使用 prefix 在 Mac OS X Leopard 上安装了 Ruby 1.9.1 和 Ruby 1.8.6。和 program-suffix选项,以便我可以通过发出 ruby19、i
假设我有一个像下面这样的简单装饰方法: def my_decorator(fn): def _wrapper(*args, **kwargs): print 'Calling decora
我想在文件更改时自动启动构建。 我在 Ruby 中使用过 autospec (RSpec) 并且喜欢它。 如何在 bash 中做到这一点? 最佳答案 看看incron和 inotify-tools .
安装 rspec/ZenTest 并运行 autospec 后,它按预期第一次运行了我的规范。在对我的一个规范进行更改并在第二次运行时,我得到以下结果: /usr/bin/ruby1.8 /usr/l
我的理解是,此处使用的最简单形式的 autospec 将根据提供的参数检查被模拟的函数的签名。其目的是在它们不匹配时引发错误。在下面的代码中,它似乎注入(inject)了一个额外的参数——对象本身。为
我想模拟一个具有以下要求的类: 该类具有公共(public)读/写属性,在其 __init__() 方法中定义 该类具有在创建对象时自动递增的公共(public)属性 我希望使用 autospec=T
我有这个工厂: Factory.define :email_address do |e| e.sequence(:address) { |n| "factory_#{n}@example.com"
试图围绕 Spec 和 Autospec 之间的区别进行思考。他们似乎差不多。具体来说,如果您查看 mock.patch 装饰器。 有人可以解释什么时候使用哪个? https://docs.pytho
http://lists.idyll.org/pipermail/testing-in-python/2013-March/005467.html 我昨天发布了这个。我无意匆忙和重复。但我想尽快解决这
我总是运行 autospec 以同时运行功能和 RSpec,但在我的本地计算机上运行所有功能通常很耗时。我会在提交代码之前运行每个功能。 我想在 autospec 命令中传递参数。 autospec
我是一名优秀的程序员,十分优秀!