4

我正在使用另一个 SO 建议进行 importing simplejson,内容如下:

try:
    import simplejson as json
except ImportError:
    import json

但是,在编写我的单元测试以查看“其中一个 json 模块”是否实际上已被导入时,我陷入了我自己设计的循环噩梦中!/叹。

class AreAllModulesLoaded(unit.TestCase):
    """Test to make sure all modules are loaded"""
    def test_json(self):
        try:
            self.assertTrue("simplejson" in sys.modules)
        except:
            try:
                self.assertTrue("json" in sys.modules)
            except AssertionError:
                raise

我认为这样的事情会起作用,但是,在检查unittest.failUnlessor unittest.assertTrue(我都尝试过)时,它会引发失败并且测试停止(它失败是因为我只通过加载json而不是加载导致失败simplejson)......

我的预期目标是我希望我的单元测试确认已加载 json 或 simplejson。我该怎么办?

我曾考虑在断言之前捕获“真实性”,然后只传递“真”或“假”,但这对于单元测试来说并不合适,因为我认为这应该是单元测试的一部分而不是工作-around(这是我的观点,也许你感觉不同)。例如,我曾想过做一些类似(python-esque pseduoish code)的事情:

_simplejsonLoaded = "simplejson" in sys.modules
_jsonLoaded = "json" in sys.modules

self.assertTrue(_simplejsonLoaded or _jsonLoaded)

(我是正式单元测试的新手——所以,如果这里看起来有些疯狂,请告诉我)。

其他信息:

  • 我正在使用 Python 2.6(出于工作原因 - 无法更改)
  • Windows 和 Linux
4

2 回答 2

1

我认为您不需要 TestCase 中的 try/except 内容

import sys
import unittest
try:
    import simplejson as json
except ImportError:
    import json

class TestSomething(unittest.TestCase):
    def test_json(self):
        if ('json' in sys.modules or 'simplejson' in sys.modules):
            self.assert_(True, "some kind of json loaded")
        else:
            self.fail()

if __name__ == "__main__":
    unittest.main()
于 2013-10-29T20:01:47.323 回答
1

好吧,问题是你是否真的关心你导入了哪个特定的库。当您导入时,您也输入simplejson as jsonjson符号,sys.modules这才是真正重要的,对吧?当然,您可以随后检查导入的json库是否具有您自己的程序所需的所有方法和属性,但这是另一个问题。因此,测试的正确定义不只是:

import sys
import my_own_module

class TestSomething(unittest.TestCase):
    def test_json(self):
        self.assertIn('json', sys.modules,
                      "json API not loaded")
于 2015-10-21T14:38:23.530 回答