为了测试一个轮询函数,我想模拟一个子函数的调用,这样第一次调用它就会失败,第二次调用它就会成功.这是一个非常简化的版本:
poll_function(var1):
value = sub_function(var1) # First call will return None
while not value:
time.sleep(POLLING_INTERVAL)
value = sub_function(var1) # A subsequent call will return a string, e.g "data"
return value
Run Code Online (Sandbox Code Playgroud)
这可能与框架中的Mock
对象有关mock
吗?我知道Mock
对象有一个call_count
我应该可以以某种方式使用的属性.
现在我已经通过创建一个我用来修补补丁的自定义模拟对象来解决它sub_function()
,但我觉得应该有一个更好的更简洁的方法:
def test_poll():
class MyMock(object):
def __init__(self, *args):
self.call_count = 0
def sub_function(self, *args, **kwargs):
if self.call_count > 1:
return "data"
else:
self.call_count += 1
return None
my_mock = MyMock()
with patch('sub_function', my_mock.sub_function):
ok_(poll_function())
Run Code Online (Sandbox Code Playgroud) 我们有一个像这样的Python项目:
project/
??? .pylintrc
??? module1.py
??? module2.py
??? tests/
??? test_module1.py
??? test_module2.py
Run Code Online (Sandbox Code Playgroud)
我们的单元和功能测试位于名为的文件夹中tests/
.当谈到测试pylint的警告missing-docstring
,invalid-name
并且protected-access
是不相关的.另一方面,这些警告对项目中的实际代码非常有用.
我的问题是,它是否可以添加会忽略missing-docstring
,invalid-name
并且protected-access
在.pylintrc
应用到模块的-file tests/
-folder 只?
如果可能,我们不希望将#
这些警告的-disables 添加到文件夹内的每个测试模块.
在Buildbot中,我需要能够在编译步骤之前"获取"环境.
如果我使用bash从命令行构建应用程序,我将不得不这样做:
. envrionment-set-up-script
build_command
Run Code Online (Sandbox Code Playgroud)
在build bot master.cfg文件中,我尝试了以下内容:
factory.addStep(ShellCommand(command=["source","environment-set-up-script"])
factory.addStep(ShellCommand(command=[".","environment-set-up-script"]))
factory.addStep(Configure(command=["source","environment-set-up-script"]))
factory.addStep(Configure(command=[".","environment-set-up-script"]))
Run Code Online (Sandbox Code Playgroud)
所有这些都失败了,这是因为无法找到命令,这是有道理的,因为它是一个内置的bash.
此外,我不认为这是正确的方法,因为在调用工厂的下一步时不一定会使用环境.
为了简化我的代码,我想实现一个包含所有内容的集合.我认为解决这个问题的最简单方法是使用一个自定义集,为任何查询返回True.在我的特定情况下,我最感兴趣的是集合的交叉,以便满足以下条件:
u_set = UniversalSet()
u_set & {1, 2, 3} == {1, 2, 3} # (1)
{1, 2, 3} & u_set == {1, 2, 3} # (2)
Run Code Online (Sandbox Code Playgroud)
我UniversalSet
按以下方式进行了子类化:
class UniversalSet(set):
def __and__(self, other):
return other
Run Code Online (Sandbox Code Playgroud)
这适用于__intersect__
,但set
仍然失败.是否有同样简单的(1)
工作方式?