Python unittest AssertionError:unicode字符串不是unicode字符串

时间:2015-12-08 02:21:42

标签: python python-2.7 unit-testing selenium

我有一个Web服务器,它返回包含以下内容的HTML:

<div class="well">
    <blockquote>
        <h2>Blueberry Pancakes Are Bomb</h2>
    </blockquote>
</div>

我写了一个像这样的人为的功能测试:

def test_page_has_blueberry_in_blockquote(self):
    # User goes to inspire_my_palate page
    self.browser.get('http://localhost:8000/inspire_my_palate')

    # He sees a blockquote with a header containing 'Blueberry ...'
    food_text = self.browser.find_element_by_xpath('//div[@class="well"]/blockquote/h2').text
    self.assertIs(food_text, u'Blueberry Pancakes Are Bomb')

当我运行测试时,我收到此错误:

(foodie_env)fatman:foodie$ python functional_tests.py
.F
======================================================================
FAIL: test_page_has_blueberry_in_blockquote (__main__.NewVisitorNavbar)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "functional_tests.py", line 179, in test_page_has_blueberry_in_blockquote
    self.assertIs(food_text, u'Blueberry Pancakes Are Bomb')
AssertionError: u'Blueberry Pancakes Are Bomb' is not u'Blueberry Pancakes Are Bomb'

----------------------------------------------------------------------
Ran 2 tests in 6.656s

FAILED (failures=1)

我也尝试过:

self.assertIs(food_text, 'Blueberry Pancakes Are Bomb')

将字符串转换为unicode或不显示更改任何内容。我仍然得到相同的断言错误。

更新:如果我将断言测试更改为:

,我会通过测试
self.assertEquals(food_text, u'Blueberry Pancakes Are Bomb')

但是,我仍然想知道assertIs()测试失败的原因。我猜这是由于字符串在内存中的表示方式。直观地说,assertIs()版本应该通过,因为我比较了两种字符串类型。

断言错误不是很直观,而且令人困惑。什么可能导致这种奇怪的断言错误?

2 个答案:

答案 0 :(得分:3)

尝试将if(file_exists("../media/books/$oldcover")) { unlink("../media/books/$oldcover"); } else { //do nothing } 支票替换为:

assertIs

答案 1 :(得分:0)

为了更多地了解@ TomKarzes的答案,#include <map> class Registry { template<class configclass> std::map<std::wstring, configclass> enumerateSubKeys(std::wstring subKeyName); } 正在评估两个对象。在以下代码中,两个字符串在内存中表示为两个不同的对象:

assertIs()

因此,这个断言会失败,因为这两个对象不会评估相同的东西。

另一方面,self.assertEqual(food_text, u'Blueberry Pancakes Are Bomb') 正在比较两个字符串的相似性,因此这个断言通过了。