希望Python assertRaises()失败,但测试始终通过

希望Python assertRaises()失败,但测试始终通过,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我正在尝试使用TDD,所以我一直在尝试从Python的unittest模块开始。我写了一个测试,我完全期待失败,但它总是通过!以下是测试代码: def test_file_not_found_exception(self): invalid_config = "Testing/invalidExperiment.xml" experiment_with_invalid_config = MyClass(invalid_config) self.assertRaises(O

我正在尝试使用TDD,所以我一直在尝试从Python的unittest模块开始。我写了一个测试,我完全期待失败,但它总是通过!以下是测试代码:

def test_file_not_found_exception(self):
    invalid_config = "Testing/invalidExperiment.xml"
    experiment_with_invalid_config = MyClass(invalid_config)
    self.assertRaises(OSError, experiment_with_invalid_config.run_experiment())
我的类定义如下:

class MyClass:
    def __init__(self, experiments, output_directory = ".")
        self._experiments = experiments
        self._output_directory = output_directory
    def run_experiment(self):
        try:
            x = 2 # dummy statement
        except OSError:
            print "Experiment file not found"
        except:
            print "Unexpected Error"

我认为try块应该总是正确执行,所以我不知道为什么我的unittest总是通过。我对Python中的OOP非常陌生,所以我可能犯了一个非常明显的错误。。。另外,如果我在run\u experience()方法的try-except块中捕获到异常,assertRaises()调用是否可以工作?

您正在调用函数
MyClass.run\u experiment
,并将其输出传递给self.assertRaises,因此当它无法引发时,它不会正确注册错误

错误示例:

import unittest
class MyClass(object): 
    def __init__(self, config): 
        pass
    def run_experiment(self): pass

class MainTest(unittest.TestCase): 
    def test_file_not_found_exception(self):
        invalid_config = "Testing/invalidExperiment.xml"
        experiment_with_invalid_config = MyClass(invalid_config)
        self.assertRaises(OSError, experiment_with_invalid_config.run_experiment())

if __name__ == "__main__":
    unittest.main()
正确:

with self.assertRaises(OSError): 
    experiment_with_invalid_config.run_experiment() 


我认为,因为您正在捕获代码中的异常,所以您的测试不会收到OSError异常。我从方法体中删除了try-except块,它仍然会通过。。。可疑。我也不确定你的考试怎么会不及格?通常你不会调用传递给self.assertRaises的函数-你能建议重新编写测试代码吗?通常你不需要,比如self.assertRaises(Exception):func()或self.assertRaises(Exception,func),我不知道为什么传递值时它不会失败。谢谢!我没有注意到我应该在没有括号的情况下运行它。另外,在您对我的示例的重新表述中,您没有包含多余的括号,因此您标记为错误示例的内容实际上是正确的!我很惊讶您没有收到错误,因为通常像
1()
None()
这样的东西会引发
TypeError
,但显然,如果
None
传递给self.assertRaises,它不会像传递了
1
这样的非无、不可调用的值那样尝试调用
None()
。这是一种奇怪的行为,的确很奇怪。再次感谢你的帮助!
self.assertRaises(OSError, experiment_with_invalid_config.run_experiment)