Python单元测试:断言错误问题

时间:2016-03-31 10:45:02

标签: python unit-testing

我正在为以下功能编写单元测试:

def _parse_args():
    parser = argparse.ArgumentParser(
        description='Script to configure appliance.'
    )
    parser.add_argument('--config_file',
                        help='Path to a JSON configuration file') 
    print parser.parse_args()
    return parser.parse_args()

当我在没有给出配置文件的情况下运行该函数时(使用上面函数中的print语句验证): parser.parse_args()=Namespace(config_file=None)

在我的单元测试中,我运行没有给出配置文件的函数,并包含一个assertEquals:

self.assertEquals(my_script._parse_args(), 'Namespace(config_file=None)')

但这会产生AssertionError:

AssertionError: Namespace(config_file=None) != 'Namespace(config_file=None)'

如果我将单元测试更改为不带引号:

self.assertEquals(my_script._parse_args(), Namespace(config_file=None))

我得到一个NameError:

NameError: global name 'Namespace' is not defined

显然使用引号不是正确的方法,但我如何断言Namespace(config_file=None)正在发生?

3 个答案:

答案 0 :(得分:1)

检查返回的config_file对象的Namespace属性。

self.assertIsNone(my_script._parse_args().config_file)

答案 1 :(得分:1)

更改

userspace_return = 12
or
userspace['return'] = 12

self.assertEquals(my_script._parse_args(), Namespace(config_file=None))

self.assertEquals(my_script._parse_args(), argparse.Namespace(config_file=None)) 是您导入的Namespace模块的属性。您没有单独导入argparse

用于执行没有参数的代码的演示:

Namespace

答案 2 :(得分:0)

您的函数_parse_args()通过调用print parser.parse_args()返回一个名称空间对象,而不是它的字符串表示形式。

让我们来看看你的功能:

def _parse_args():
    #some code
    print parser.parse_args()    <-- prints the string representation of the Namespace object 'Namespace(config_file=None)'
    return parser.parse_args()   <-- returns the Namespace object

对于返回的对象,您可以使用点表示法来访问它所持有的属性:

my_script._parse_args().config_file

并断言是否不是None:

self.assertIsNone(my_script._parse_args().config_file)

或者您可以通过调用其构造函数来创建任何Namespace对象:

argparse.Namespace (config_file = None, another_arg='some value')

并在assertEqual:

中使用它
self.assertEqual(my_script._parse_args(), argparse.Namespace (config_file = None))