PYTHON:nosetests导入包含多个模块/文件的文件路径

时间:2016-03-30 19:52:33

标签: python unit-testing import nose

我目前正在使用LearnPythonTheHardWay并已达到Exercise 48详细信息 Nosetests 。只要所有代码都在一个python.py文件中,我就可以执行单元测试。但是,如果我将其他文件作为程序的一部分包括在内,即使用 import 然后尝试 nosetest 这样的项目,我会收到错误,如下所示:

  

=============================================== =======================

     

错误:失败:ImportError(没有名为' temp'的模块)

     

追踪(最近的呼叫最后):
    文件" /usr/local/lib/python3.4/dist-packages/nose/failure.py",第39行,在runTest中       提升self.exc_val.with_traceback(self.tb)
    文件" /usr/local/lib/python3.4/dist-packages/nose/loader.py",第414行,在loadTestsFromName中## ##
      addr.filename,addr.module)
    文件" /usr/local/lib/python3.4/dist-packages/nose/importer.py",第47行,在importFromPath中       return self.importFromDir(dir_path,fqname)
    文件" /usr/local/lib/python3.4/dist-packages/nose/importer.py",第94行,在importFromDir中       mod = load_module(part_fqname,fh,filename,desc)
    文件" /usr/lib/python3.4/imp.py" ;,第235行,在load_module中       return load_source(name,filename,file)
    文件" /usr/lib/python3.4/imp.py",第171行,在load_source中       module = methods.load()
    文件"",第1220行,在加载中     文件"",第1200行,在_load_unlocked中     文件"",第1129行,在_exec中     文件"",第1471行,在exec_module中     文件"",第321行,在_call_with_frames_removed中     文件" /home/user/LEARNPYTHONTHEHARDWAY/ex48/tests/scanner_tests.py" ;,第6行,中
      来自ex48.scanner import lexicon
    文件" /home/user/LEARNPYTHONTHEHARDWAY/ex48/ex48/scanner.py" ;,第6行,中
      进口温度
  ImportError:没有名为' temp'

  

在0.028s中进行1次测试

     

失败(错误= 1)

我的项目目录的结构如下:

ex48/
  ex48/
     scanner.py
     temp.py
  __pycache__/
  tests/
     __init__.py
    scanner_tests.py

我的目录::

的屏幕截图

enter image description here

文件本身的屏幕截图::

enter image description here

enter image description here

enter image description here 我的 scanner_tests.py 文件如下:

from nose.tools import *
from ex48.scanner import lexicon
from ex48 import temp

def test_directions():
    assert_equal(lexicon.scan("north"),[('direction','north')])
        result = lexicon.scan("north south east")
        assert_equal(result, [('direction', 'north'),
                          ('direction', 'south'),
                          ('direction', 'east')])

我的 scanner.py 文件如下:

   import temp

   class lexicon:
       def scan(val):
          if(val == "north"):
              return [('direction', 'north')]
          else:
              return [('direction', 'north'),
                      ('direction', 'south'),
                      ('direction', 'east')]

    runner = temp.temp("hello")

最后我的 temp.py 文件如下:

   class temp(object):
       def __init__(self,name):
           self.name = name
       def run(self):
           print "Your name is; %s" % self.name     
    runner.run()

我的问题是如何克服导入错误:没有名为' temp' 的模块,因为好像我已经导入了 temp.py 文件在scanner.py文件和 scanner_tests.py 文件中,但鼻子似乎无法在运行时导入它。 Nosetests 仅在单个 scanner.py 文件中正常工作,但在导入时则无法正常工作。是否有特殊的语法导入鼻子的单元测试?在运行并在命令行中正确导入时,该脚本也可以正常工作。

*注意:我正在关闭在线服务器上的有限帐户运行python,因此某些管理员权限不可用。

**下面的注释是与另一个项目截然不同的完全相同的错误:

目录布局: enter image description here

Game.py:

enter image description here

Otherpy.py - 导入的文件:

enter image description here

鼻子测试脚本文件:

enter image description here

最后是nosetests importerror:

enter image description here

2 个答案:

答案 0 :(得分:0)

一切都需要与执行点有关。您正在从ex48的根目录运行您的鼻子命令,因此您的所有导入都需要与该位置相关。

因此,在game.py中,您应该根据ex48进行导入。因此:

from ex48.otherpy import House

应该对引用temp文件夹的示例应用相同的逻辑。

from ex48.temp import temp

答案 1 :(得分:0)

我找到的唯一解决方案是将以下内容发布到主文件的顶部:

try: 
     # This handles imports when running .py files from inside app directory
     from file_to_import.py import class_instance
except:
     # This handles imports when running nosetests from top-level (above app) 
     # directory
     from directory_containing_app_files.file_to_import import class_instance

我对替代解决方案非常感兴趣。