我正在运行一个python代码。运行后,代码运行良好,但在测试代码时显示
nameError未定义全局名称。
这是代码
def is_isogram(word):
if type(word)== str:
for i in word:
if word.count(i) >1 or word == "":
return (word, False)
else:
return (word, True)
else:
raise TypeError ("'{}' should be a string" .format(word))
这是测试代码
from unittest import TestCase
class IsogramTestCases(TestCase):
def test_checks_for_isograms(self):
word = 'abolishment'
self.assertEqual(
is_isogram(word),
(word, True),
msg="Isogram word, '{}' not detected correctly".format(word)
)
def test_returns_false_for_nonisograms(self):
word = 'alphabet'
self.assertEqual(
is_isogram(word),
(word, False),
msg="Non isogram word, '{}' falsely detected".format(word)
)
def test_it_only_accepts_strings(self):
with self.assertRaises(TypeError) as context:
is_isogram(2)
self.assertEqual(
'Argument should be a string',
context.exception.message,
'String inputs allowed only'
)
答案 0 :(得分:0)
您的问题并不完全清楚,但我会尝试正确回答。
您的Global name is_isogram is not defined
附加,因为您没有在测试文件中导入代码。您必须执行from mycode import is_isogram
才能在代码中使用测试用例。如果你没有告诉他,你的测试不知道你的功能在哪里。
另一点,你的函数is_isogram没有做你想要她做的事情,请在你的代码中看到我的评论:
def is_isogram(word):
if type(word)== str:
for i in word: # You did a loop here, but...
# You go out this loop at the first iteration!
if word.count(i) >1 or word == "": # Here
return (word, False)
else:
return (word, True) # Or here
# You only test the first letter in your word.. You have to move the
# return (word, True) outside the loop
else:
raise TypeError ("'{}' should be a string" .format(word))
您的测试用例有效,因为字母为2'a',而'a'位于第一位。但是如果你尝试'课程',你的测试将返回True,而不应该。
解决方案可能是:
def is_isogram(word):
if type(word) is str:
for i in word:
if word.count(i) > 1:
return (word, False)
return (word, True)
else:
raise TypeError("'{}' should be a string" .format(word))
答案 1 :(得分:0)
我觉得你应该做一个word.strip()==""
以确保条件总是检查空字符串。我认为你的代码应该在那之后工作。
答案 2 :(得分:0)
首先,确保您的函数与测试文件位于同一文件中(在测试类之前)或从另一个文件导入。这样,您就不会出现 NameError 错误。 然后,尝试运行测试并发布您可能遇到的任何进一步的错误或问题。