2015-12-08 140 views
0

所以我正在运行py.test并尝试使用monkeypatch。我知道monkeypatch的预期目的是替换模块中的属性,以便测试它们。而且我知道我们可以用模拟函数来替代,以便做到这一点。猴子补丁不能正常工作

目前我试图运行本质上下面的代码块。

from src.module.submodule import * 

def mock_function(parameter = None): 
    return 0 

def test_function_works(monkeypatch): 
    monkeypatch.setattr("src.module.submodule.function",mock_function ] 
    assert function(parameter = None) == 0 

当测试运行,而不是在mock_function交换,它只是运行function。请问有没有理由monkeypatch没有激活

我有猴子补丁运行成功与其他代码之前。所以我不明白为什么这不起作用。

回答

0

我还没有使用pytest这个东西,但我知道,使用mock库时,函数被修补到它们被调用的命名空间中。即from src.module.submodule import *src.module.submodule.function导入到您的名称空间中,但是您将其修补到其原始名称空间中,因此该函数的本地名称仍可访问原始未修补的代码。

如果您更改为

import src.module.submodule 

def mock_function(parameter = None): 
    return 0 

def test_function_works(monkeypatch): 
    monkeypatch.setattr("src.module.submodule.function",mock_function ] 
    assert src.module.submodule.function(parameter = None) == 0 

没有成功呢?

+0

这工作! TY –

1

看起来像一个错字,应该不会是

monkeypatch.setattr("src.module.submodule.function",mockIfunction) 

mockIfunction代替mock_function

+0

这些都是假的文件名,所以忽略拼写错误。我不能发布实际的工作代码 –

+1

但大概'mockIfunction'和'mock_function'应该匹配,否则你在嘲笑你的功能? –