我试图对python函数进行单元测试,但似乎没有替换函数内的任何字符。即使该功能应该有效吗?
错误消息:
E AssertionError: assert 'TE/ST-' == 'AEOEAA_TE_ST_'
E - æøå TE/ST-
E + AEOEAA_TE_ST_
功能
class Formatter(object):
@classmethod
def string(self, string):
new_string = string.upper()
# split cases
new_string.replace(' ', '_')
new_string.replace('-', '_')
new_string.replace('/', '_')
# chars
new_string.replace('Ø', 'OE')
new_string.replace('Å', 'AA')
new_string.replace('Æ', 'AE')
return new_string
测试
def test_formatter():
test = Formatter.string('æøå te/st-')
assert test.decode('utf-8') == 'AEOEAA_TE_ST_'
答案 0 :(得分:4)
str.replace
不是就地函数,这意味着当你调用它时,返回一个你必须分配回到原始变量的值,否则不会看到变化。例如,请考虑:
In [315]: string = 'æøå te/st-'.upper()
现在,请致电.replace
:
In [316]: string.replace('Ø', 'OE')
Out[316]: 'ÆOEÅ TE/ST-'
In [317]: string
Out[317]: 'ÆØÅ TE/ST-'
没有变化。现在尝试将其分配回来:
In [318]: string = string.replace('Ø', 'OE')
In [319]: string
Out[319]: 'ÆOEÅ TE/ST-'
作为更快的替代方案,请考虑使用str.translate
。如果您使用的是python3,则可以传递替换的字典映射(您不能在python2上执行此操作)。
class Formatter(object):
@classmethod
def string(self, strn):
tab = dict.fromkeys(' -/', '_')
tab.update({'Ø' : 'OE', 'Å' : 'AA', 'Æ' : 'AE'})
return strn.upper().translate(str.maketrans(tab))
对于python2,您可以选择坚持使用str.replace
。