【问题标题】:Django unit testing: assertEqual() failsDjango 单元测试:assertEqual() 失败
【发布时间】:2016-01-06 13:42:59
【问题描述】:

我正在关注《Python 中的测试驱动开发》一书,具有以下功能:

tests.py:

def testHomePageCanSaveAPostRequest(self):
    request = HttpRequest()
    request.method = 'POST'
    request.POST['itemText'] = 'A new list item'

    response = homePage(request)
    if response:
        response = response.content.decode('UTF-8')

    self.assertIn('A new list item', response)

    expectedHTML = render(request, 'lists/home.html', {'itemText':'A new list item'})
    if expectedHTML:
        expectedHTML = expectedHTML.content.decode('UTF-8')

    print(response)
    print(expectedHTML)
    if response==expectedHTML:
        print('Same')

    self.assertIn('A new list item', expectedHTML)

    self.assertEqual(response, expectedHTML)

views.py

def homePage(request):
    print(request.POST.get('itemText'))
    return render(request, 'lists/home.html', {'itemText':request.POST.get('itemText')})

home.html:

...
<form method=POST>
  <input id=newItem name=itemText placeholder="Enter a to-do item">
</form>
<table id=listTable>
  <tr><td>{{itemText}}</td></tr>
</table>
...

assertIn(..., response)assertIn(..., expectedHTML) 都成功了,这意味着 responseexpectedHTML 中都有“新列表项”。

我还打印出responseexpectedHMTL,它们看起来完全一样。比较还打印出“相同”,表明它们是相同的。

但是,assertEqual 失败并出现以下逐行比较:

...
  <table id=listTable>
-   <tr><td>None</td></tr>
?           ----
+   <tr><td></td></tr>
  </table>
...

一个是None,另一个是空的。?我做错了什么?

编辑: 整个测试输出如下:

Creating test database for alias 'default'...
A new list item
<!doctype html>
<html>
<head>
<title>To do list</title>
<meta charset=utf-8>
</head>
<body>
<h1>Your to do list</h1>
<form method=POST>
  <input id=newItem name=itemText placeholder="Enter a to-do item">
</form>
<table id=listTable>
  <tr><td>A new list item</td></tr>
</table>
</body>
</html>
<!doctype html>
<html>
<head>
<title>To do list</title>
<meta charset=utf-8>
</head>
<body>
<h1>Your to do list</h1>
<form method=POST>
  <input id=newItem name=itemText placeholder="Enter a to-do item">
</form>
<table id=listTable>
  <tr><td>A new list item</td></tr>
</table>
</body>
</html>
Same
.None
F.
======================================================================
FAIL: testHomePageReturnsCorrectHTML (lists.tests.HomePageTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yltang/course/TDD/lecture/python/webapps/git/superlists/superlists/lists/tests.py", line 27, in testHomePageReturnsCorrectHTML
    self.assertEqual(response, expectedHTML)
AssertionError: '<!do[231 chars]stTable>\n  <tr><td>None</td></tr>\n</table>\n</body>\n</html>' != '<!do[231 chars]stTable>\n  <tr><td></td></tr>\n</table>\n</body>\n</html>'
  <!doctype html>
  <html>
  <head>
  <title>To do list</title>
  <meta charset=utf-8>
  </head>
  <body>
  <h1>Your to do list</h1>
  <form method=POST>
    <input id=newItem name=itemText placeholder="Enter a to-do item">
  </form>
  <table id=listTable>
-   <tr><td>None</td></tr>
?           ----
+   <tr><td></td></tr>
  </table>
  </body>
  </html>

----------------------------------------------------------------------
Ran 3 tests in 0.017s

FAILED (failures=1)
Destroying test database for alias 'default'...

【问题讨论】:

  • 消息过长。

标签: django unit-testing


【解决方案1】:

您已将打印语句添加到不同的测试中。打印语句在testHomePageCanSaveAPostRequest,正在通过。

失败的测试是testHomePageReturnsCorrectHTML,您的问题中没有包含它。

【讨论】:

  • 是的,没错。我知道了。我觉得这本书有点误导。感谢一百万 Alasdair。
猜你喜欢
  • 1970-01-01
  • 2018-01-12
  • 2018-11-25
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多