【问题标题】:How do I check if code is being run from a nose-test?如何检查代码是否正在通过鼻子测试运行?
【发布时间】:2016-04-08 12:10:00
【问题描述】:

我有一些用于单元测试的代码。但是,它加载的库需要一些鼻子测试实际上不需要的数据,因为这些数据是由单元测试模拟出来的。我想保护库中的文件读取,以便在鼻子测试的情况下不会调用它们。

有没有简单的方法可以做到这一点?

我可能可以使用 sys.modules 或初始命令行来做一些事情,但我更喜欢更优雅的东西,如果它存在的话。

【问题讨论】:

  • 什么是鼻子测试
  • 这是一个特定的单元测试框架。
  • 如何检查某个文件是否存在,如果不存在,则将代码标记为“nose-test”并阻止加载此类文件。
  • 我不明白 - 如果它被模拟了,为什么读取仍然发生?你能提供一个minimal reproducible example吗?
  • @BrianPostow:你不应该因为你的测试而修改你的代码。如果您觉得必须这样做,则可能表明您的设计很糟糕。

标签: python nose


【解决方案1】:

正确的方法是用空的模拟来模拟所有带有副作用的代码(我假设你不想要什么)。

给定tested_module my_module:

def do_something_and_destroy_world():
    destroy_world()
    return None

示例测试文件是:

import mock
import unittest

import my_module

class MyTest(unittest.TestCase):
    def testSomethingUgly(self):
        with mock.patch('my_module.destroy_world', return_value=None):
            result = do_something_and_destroy_world()
            self.assertIsNone(result)

运行测试时,断言是正确的,destroy_world 不会被调用 - 而是被替换为具有固定返回值的空模拟。

【讨论】:

  • 不错。我认为它在我当前的代码中不会很好地工作,因为凌乱的代码实际上不在方法中。除非我可以在导入时使用 mock.patch 进行操作,否则它会变得一团糟……但很高兴知道在健全的代码中执行此操作的正确方法是什么……
【解决方案2】:

正如cmets中所说,这段代码的结构是一团糟,测试的一部分目的是确保我在重构时不会破坏东西......

所以,就目前而言,(除非有人给我更好的答案),我正在使用:

if 'nose' not in sys.modules.keys():
    <read the data>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2011-05-04
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多