2016-11-07 39 views
-2

作为编程的新手,我试图单独测试每个函数,确保它的工作正确。 这是我的问题:单纯的测试,它的工作原理;将它转换为函数并将它们合并成一个脚本,它们不起作用。
例如:纯Python脚本和函数之间的技巧?

def getRigs (fileObj): 
    fileObj.seek(0) 
    rigList = [] 
    Tag = False 
    for line in fileObj: 
     if line.find("[BeginRigs]") != -1: 
      Tag = True 
     elif line.find("[EndRigs]") != -1: 
      Tag = False 
     elif Tag: 
      rigList.append(line.strip()) 
    return (rigList) 

def getObjects (fileObj): 
    fileObj.seek(0) 
    objList = [] 
    Tag = False 
    for line in fileObj: 
     if line.find("[BeginObjects]") != -1: 
      Tag = True 
     elif line.find("[EndObjects]") != -1: 
      Tag = False 
     elif Tag: 
      objList.append(line.strip()) 
    return (objList) 

def dummyRig (rigObj, objName): 
    dummy = "" 
    for rig in rigObj: 
     with open(rig, "r") as infile: 
      #rigObj.seek(0) 
      Tag = None 
      for line in infile: 
       for obj in objName: 
        if line.find("ObjectAlias " + obj + "\n") !=-1: 
         Tag = "Mark" 
         dummy += line 
         break 
        elif line.find("BeginKeyframe") != -1: 
         if Tag == "Mark": 
          Tag = "Copy" 
         break 
        elif line.find("EndKeyframe") != -1: 
         if Tag == "Copy": 
          Tag = None 
          dummy += line 
         break 
       if Tag == "Copy": 
        dummy += line 
    return (dummy) 

def getBlock (rigObj, objName): 
    Tag = False 
    block = "" 
    for line in rigObj: 
     if line.find("ObjectAlias " + str(objName) + "\n") != -1: 
      for line in rigObj: 
       if line.find("BeginKeyframe") != -1: 
        Tag = True 
       elif line.lstrip().startswith("0.000 ") and line.rstrip().endswith("default"): 
        Tag = False 
        break 
       elif Tag: 
        block += line 
    return (block) 

inputconfig = open("config.cfg", "r") 
infile = sys.argv[1] 
inputscene = open(infile, "r") 
outfile = infile.split(".")[0] + "_updated.fxs" 
outputscene = open(outfile, "w") 

a_rigList = getRigs (inputconfig) 
a_objList = getObjects (inputconfig) 

a_dummyRig = dummyRig (a_rigList, a_objList) 
#print a_dummyRig #----> Output as expected 
tmp = getBlock (a_dummyRig, a_objList) 
outputscene.write(tmp) #----> Gvie me empty output! 

如果我单独测试 “getBlock” 功能,它工作正常:

with open("result_from_a_dummyRig", "r") as rigObj, open("result", "w") as output: 
    Tag = False 
    for line in rigObj: 
     if line.find("ObjectAlias " + "rooster_bn_featherLa_rt_08" + "\n") != -1: 
      for line in rigObj: 
       if line.find("BeginKeyframe") != -1: 
        Tag = True 
       elif line.lstrip().startswith("0.000 ") and line.rstrip().endswith("default"): 
        Tag = False 
        break 
       elif Tag: 
        output.write(line) 

我在做什么错?

编辑:添加更多的我的代码,希望它有助于这个问题。该代码是设计用于从其他文件复制一些外部数据来更新我当前的文件。
谢谢bruno,我明白了你的观点。 dummyRig函数给了我一个字符串,但不是“真正的”文件。而getBlock函数需要一个“真实”的文件输入。对?
仍然希望有人给我更多有用的帮助,我不是程序员,我对python了解不多。

+1

你能否提供样本输入和预期的输出以及堆栈跟踪? –

+3

文件对象是一个迭代器,在第一个for循环之后它将是空的。使用其[[seek(0)'](https://docs.python.org/2/library/stdtypes.html#file.seek)方法将文件指针移回到开头。 –

+0

你在哪里定义了'a_objList'?为什么当它看起来期待一个对象时,为什么用一个字符串(返回'dummyRig()')调用'get_block()'? – Aemyl

回答

0

在您的“测试”中,您正在迭代打开的文件。文件迭代器迭代文件的行。

在你的脚本中,你传递给getBlock的是一个字符串,所以你要遍历字符串的单个字符。毫不奇怪,你没有得到相同的结果。

如果你想getBlock能够在一个打开的文件或一些仲裁字符串上工作,你必须将该字符串包装在一些类似文件的对象中,这些对象将遍历行而不是字符。 stdlib的StringIO模块想起...

此外,如果你真的想要认真对待测试,使用一些自动unittest框架(单元测试可能不是最性感的,但它在stdlib),并确保你真的测试同样的事情,你会传递给你的功能;)