【发布时间】:2018-08-16 14:08:10
【问题描述】:
我有一个 django 应用程序路由,如果满足某些条件,它将运行 pytest.main() 命令:
def run_single_test(request, single_test_name):
# get dict of test names, test paths
test_dict = get_single_test_names()
# check to see if test is in the dict
if single_test_name in test_dict:
for test_name,test_path in test_dict.items():
# if testname is valid run associated test
if test_name == single_test_name:
os.chdir('/lib/tests/')
run_test = pytest.main(['-v', '--json-report', test_path])
else:
return 'The requested test could not be found.'
我想包含一个单元测试来验证run_test 已执行。
执行此操作的最佳方法是什么?模拟和单元测试对我来说是新的。
我试着弄乱标准输出:
def test_run_single_test_flow_control(self):
mock_get = patch('test_automation_app.views.get_single_test_names')
mock_get = mock_get.start()
mock_get.return_value = {'test_search': 'folder/test_file.py::TestClass::test'}
results = run_single_test('this-request', 'test_search')
output = sys.stdout
self.assertEqual(output, '-v --json-report folder/test_file.py::TestClass::test')
但这会返回:
<_pytest.capture.EncodedFile object at XXXXXXXXXXXXXX>
【问题讨论】:
-
你可以模拟
pytest.main,然后验证它是用Mock.assert_called调用的。 -
我试试看,谢谢。
-
我不认为我这样做是正确的。我创建了 mock_pytest = patch('pytest.main'),然后创建了 mock_get.assert_call。这总会过去,所以我一定是实施不正确。
-
当调用
mock_get.assert_called()时,你检查get_single_test_names()在测试中被调用了;您需要使用正确的模拟来检查是否调用了pytest.main。我添加了一个答案,它应该给你一个模拟和断言模拟被调用的例子。