5

我想在我的项目中使用nose和。coverage当我用参数运行鼻子时--with-coverage,我的程序参数解析模块会发疯,因为根据它,“--with-coverage”不是一个真正的参数。

如何关闭 argparse,但仅在测试期间?鼻子说我所有的测试都失败了,因为参数不好。

4

4 回答 4

5

实际上,我前几天自己也遇到了这个问题。你不需要“禁用”你的解析模块或任何东西。您可以做的是更改argparse用于忽略它收到的那些它无法识别的参数的模块。这样它们仍然可以被其他脚本使用(例如,如果您的命令行调用将辅助参数传递给另一个程序执行)。

如果没有您的代码,我将假设您在实例parse_args()上使用标准方法。argparse.ArgumentParser将其替换为parse_known_args()

然后,每当您随后引用 parsed-argumentsNamespace对象时,您都需要指定和元素,特别是 0。虽然parse_args()单独返回 args 对象,但parse_known_args()返回元组:第一个元素是已解析的已知参数,后一个元素包含被忽略的无法识别的参数(如有必要,您可以稍后在 Python 代码中使用/传递)。

这是我自己项目的示例更改:

class RunArgs(object):
    '''
    A placeholder for processing arguments passed to program execution.
    '''

    def __init__(self):
        self.getArgs()
        #self.pause = self.args.pause  # old assignment
        self.pause = self.args[0].pause  # new assignment
        #...

    def __repr__(self):
        return "<RunArgs(t=%s, #=%s, v=%s)>" % (str(x) for x in (self.pause,self.numreads,self.verbose))

    def getArgs(self):
        global PAUSE_TIME
        global NUM_READS
        parser = argparse.ArgumentParser()
        parser.add_argument('-p', '--pause', required=False, 
            type=self.checkPauseArg, action='store', default=PAUSE_TIME)
        parser.add_argument('-n', '--numreads', required=False, 
            type=self.checkNumArg, action='store', default=NUM_READS)
        parser.add_argument('-v', '--verbose', required=False,
            action='store_true')
        #self.args = parser.parse_args()  # old parse call
        self.args = parser.parse_known_args()  # new parse call
        #...
于 2015-03-11T01:20:00.870 回答
2

我读过您可以使用nose-testconfig,或者使用mock替换调用(而不是测试它)。尽管我同意@Ned Batchelder 的观点,但它要求质疑问题的结构。

于 2015-03-29T14:03:00.800 回答
1

作为一种解决方法,您可以在当前工作目录中使用.nosercor ,而不是使用命令行参数运行鼻子:nose.cfg

[nosetests]
verbosity=3
with-coverage=1

不过,我同意这parse_known_args()是一个更好的解决方案。

于 2015-03-11T01:21:14.993 回答
0

听起来您有运行代码的测试,然后您的代码使用 argparse,它隐式地从 sys.argv 中提取参数。这是构建代码的不好方法。您的被测代码应该以其他方式将参数传递给它,以便您可以控制它看到的参数。

这是一个为什么全局变量不好的例子。sys.argv 是全局的,由整个进程共享。通过依赖全局,您限制了代码的模块化,因此也限制了可测试性。

于 2015-03-11T23:15:36.667 回答