2010-06-15 61 views
2

我有一个Python程序,它导入pythoncom(并使用pythoncom.CoCreateInstance从它)。我想为程序逻辑创建一个单元测试,而不需要导入pythoncom(所以我也可以在Linux上运行测试)。单元测试在Python中:忽略从我想测试的代码导入

有什么选择?我可以在不修改被测系统的情况下做到吗?

我发现迄今:

sys.modules["pythoncom"] = "test" 
import module_that_imports_pythoncom 

我与它的问题是,如果我有:

from pythoncom.something import something 

我会得到:

ImportError: No module named something.something 

而且sys.modules["something.something"]sys.modules["pythoncom.something.something"]没有按没有工作。

任何想法?

回答

0

您可以将import pythoncom放入try except区块。

+0

我说我不想修改被测系统,如果找不到pythoncom就不应该工作。我想要的是在我的测试中忽略或模拟pythoncom导入,所以我可以嘲笑它的一些功能。 – vaidab 2010-06-16 08:47:20

0

好的,如果您在测试中修改了PYTHONPATH,并在测试目录pythoncom的文件系统上创建了一个新的包,并包含必要的子目录?

+0

这将工作,但我正在寻找一个简单的解决方案,我可以标记这个模块已经从我的测试中导入?或者用模拟替换它?运行测试时,我不想依赖OS。 – vaidab 2010-06-17 11:09:15

1

如果你需要运行测试,他们实际上是依赖于操作系统,您可能需要使用这些装饰,例如:

def run_only(func, predicate): 
    if predicate(): 
     return func 
    else: 
     def f(*args, **kwargs): pass 
     return f 


def run_only_for_linux(func): 
    pred = lambda: sys.platform == 'linux2' 
    return run_only(func, pred) 


@run_only_for_linux 
def hello_linux(): 
    """docstring""" 
    print("hello linux") 

这样,你宣布这个测试仅在Linux上运行无需添加丑测试本身的复杂性。

+0

我得到以下运行此代码:TypeError:f()不接受任何参数(1给出) – kormoc 2012-11-06 21:54:28

+0

是的,你是对的f函数太简单了,应该现在修复.. – 2012-11-08 10:13:45