一般来说,我想禁用尽可能少的代码,并且我希望它是明确的:我不希望被测试的代码决定它是否是测试,我希望测试告诉代码“嘿,BTW,我正在运行一个单元测试,你能不能不要调用solr,而是把你要发送给solr的东西放在这里,这样我就可以检查它了”。我有我的想法,但我不喜欢他们中的任何一个,我希望有一个好的pythonic方法来做到这一点。
发布于 2010-02-24 02:28:32
在您的单元测试中使用Michael Foord的Mock,执行以下操作:
from mock import Mock
class Person(object):
def __init__(self, name):
super(Person, self).__init__()
self.name = name
def say(self, str):
print "%s says \"%s\"" % (self.name, str)
...
#In your unit test....
#create the class as normal
person = Person("Bob")
#now mock all of person's methods/attributes
person = Mock(spec=person)
#talkto is some function you are testing
talkTo(person)
#make sure the Person class's say method was called
self.assertTrue(person.say.called, "Person wasn't asked to talk")
#make sure the person said "Hello"
args = ("Hello")
keywargs = {}
self.assertEquals(person.say.call_args, (args, keywargs), "Person did not say hello")发布于 2010-02-24 01:34:14
您可以使用Mock objects拦截您不想执行的方法调用。例如,你有一些A类,你不希望no()方法在测试期间被调用。
class A:
def do(self):
print('do')
def no(self):
print('no')模拟对象可以继承自A并覆盖no()而不执行任何操作。
class MockA(A):
def no(self):
pass然后在测试代码中创建MockA对象,而不是A对象。另一种进行模拟的方法是让A和MockA实现一个公共接口,比如InterfaceA。
有大量的模仿框架可用。参见StackOverflow: Python mocking frameworks。
具体见:Google's Python mocking framework。
发布于 2010-02-24 04:03:27
我遇到的最大的问题是依赖注入的机制。我现在已经弄明白了这一部分。
我需要在两个地方以完全相同的方式导入模块,才能成功注入新代码。例如,如果我有以下要禁用的代码:
from foo_service.foo import solr
solr.add(spam)我似乎不能在我的测试运行程序中做到这一点:
from foo import solr
solr = mock_objectpython解释器必须将模块foo_service.foo和foo视为不同的条目。我将from foo import solr更改为更显式的from foo_service.foo import solr,我的模拟对象被成功注入。
https://stackoverflow.com/questions/2320210
复制相似问题