尝试进行单元测试时出现AssertionError

时间:2019-06-17 17:23:03

标签: python flask

我为将使用Flask框架处理证书的网站创建了一个Web界面。我想学习如何执行单元测试。我创建了一个文件,它将运行测试并验证routers.py文件。

Test.py代码:

import unittest
import sys
sys.path.insert(0, 'app/')
import routes


class FlaskrTestCase(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_my_file(self):
        self.assertTrue(Certificate.IsValid(all_cert[2]))


if __name__ == '__main__':
    unittest.main()

我认为错误是由于routers.py中这部分代码引起的:

@app.route('/')
@app.route('/index')
def index():
    return render_template('index.html', title='Home', all_cert = all_cert)


@app.route('/all_certificates')
def all_certificates():
    return render_template('all_certificates.html', title='all_certificates', all_cert = all_cert)

当我执行“ flask run”命令时,此方法有效,但是如果我输入python3 -m unittest test.py,则会出现错误:

  File "/home/marka/Документы/Practice/test.py", line 4, in <module>
    import routes
  File "app/routes.py", line 30, in <module>
    @app.route('/index')
  File "/home/marka/Документы/Practice/venv/lib/python3.5/site-packages/flask/app.py", line 1251, in decorator
    self.add_url_rule(rule, endpoint, f, **options)
  File "/home/marka/Документы/Practice/venv/lib/python3.5/site-packages/flask/app.py", line 67, in wrapper_func
    return f(self, *args, **kwargs)
  File "/home/marka/Документы/Practice/venv/lib/python3.5/site-packages/flask/app.py", line 1222, in add_url_rule
    'existing endpoint function: %s' % endpoint)
AssertionError: View function mapping is overwriting an existing endpoint function: index

我在论坛上找到了一个类似的主题:AssertionError: View function mapping is overwriting an existing endpoint function: main,但是我不知道如何在我的代码中应用它。是什么导致错误?如何不同地使用装饰器?

我试图重命名函数索引:

def index():
    index.func_name = func.func_name
    return render_template('index.html', title='Home', all_cert = all_cert)

然后我得到错误:

  File "/home/marka/Документы/Practice/test.py", line 4, in <module>
    import routes
  File "app/routes.py", line 33
    return render_template('index.html', title='Home', all_cert = all_cert)
                                                                          ^
IndentationError: unindent does not match any outer indentation level

在测试中,我想检查存储证书的功能并验证其有效性。 我所有的代码都在https://github.com/Butyrate/CertificationCenter中。

谢谢。

1 个答案:

答案 0 :(得分:0)

由于routes模块已加载两次,因此您收到该错误。如您所知,python只加载模块一次。该规则的例外是,您将模块多次添加到python路径中:

sys.path.insert(0, 'app/')

如果删除该行,则不会多次重新定义主函数。您只需在您的print文件的顶层写一个routes.py即可查看我要告诉您的内容。您将看到它如何打印两次。