修改
所以我再次尝试使用一个名为test2.py
的新文件,它可以正常运行。我打包了repoman
,test.py
位于src
文件夹中。我在创建并安装test.py
后修改了repoman egg
。我认为这就是问题所在。但感谢你的帮助。你们认为这是确切的原因吗?
import unittest
import requests
from repoman.core import ultraman, supported
from repoman.ext import writefile,locate_repo
class TestWriteFile(unittest.TestCase):
def setUp(self):
self.username = 'dummy'
self.password = 'dummy'
self.remote = 'http://192.168.1.138:6666/scm/hg/NCL'
def test_scm_permission(self):
"""
Test SCM login.
"""
r = requests.get("http://192.168.1.138:6666/scm/", auth=(self.username, self.password))
self.assertTrue(r.ok)
if __name__ == '__main__':
unittest.main()
正在运行python test.py
我收到此错误:
Traceback (most recent call last):
File "test.py", line 7, in <module>
class TestWriteFile(unittest.TestCase):
File "test.py", line 19, in TestWriteFile
self.assertTrue(r.ok)
NameError: name 'self' is not defined
我认为我不需要覆盖__init__
功能,是吗?是什么导致了这个?为什么self
没有定义?我已经宣布了我的超类unittest.TestCase
感谢。
我基本上是从官方样本中学到的:Unittest - Basic Example
答案 0 :(得分:7)
我不确定问题的来源 - 是复制错误还是错误的test.py正在执行[更新:或者一些混合的制表符和空格问题,我永远无法弄明白得到标记,当他们没有] - 但根本原因几乎肯定是缩进错误。
请注意错误消息是
NameError: name 'self' is not defined
而不是
NameError: global name 'self' is not defined
@Rik Poggi得到了。如果您将self.assertTrue
一个级别移入/向上,则会发生这种情况:
~/coding$ cat test_good_indentation.py
import unittest
class TestWriteFile(unittest.TestCase):
def test(self):
"""
Doc goes here.
"""
self.assertTrue(1)
if __name__ == '__main__':
unittest.main()
~/coding$ python test_good_indentation.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
与
~/coding$ cat test_bad_indentation.py
import unittest
class TestWriteFile(unittest.TestCase):
def test(self):
"""
Doc goes here.
"""
self.assertTrue(1)
if __name__ == '__main__':
unittest.main()
~/coding$ python test_bad_indentation.py
Traceback (most recent call last):
File "test_bad_indentation.py", line 3, in <module>
class TestWriteFile(unittest.TestCase):
File "test_bad_indentation.py", line 8, in TestWriteFile
self.assertTrue(1)
NameError: name 'self' is not defined
答案 1 :(得分:6)
我不认为你展示的是实际执行的代码。
我和其他人相信,出于以下几个原因:
self.assertTrue(r.ok)
失败,那么之前的行也是如此。因此self.assertTrue(r.ok)
将不会执行。 (如David Heffernan所述) 我说你可能犯了这种错字:
def test_scm_permission(self):
^
|
and wrote something here that's not self
在某个文件中执行而不是您正在显示的文件。
看一下这个例子:
# test.py
class MyClass:
def func(sel): # typo error here
self.name = 10
obj = MyClass()
obj.func()
当我试图跑步时:
$ python3 test.py
Traceback (most recent call last):
File "test.py", line 8, in <module>
obj.func()
File "test.py", line 4, in func
self.name = 10
NameError: global name 'self' is not defined
跟你的追溯相似。
注意:另外,如果我没有计算错误self.assertTrue(r.ok)
在第18行,而不是第19行(这是你的追溯中显示的数字)。
答案 2 :(得分:2)
这是David Heffernan评论的重写。
您发布的代码不能成为追溯的原因。
从您的代码中考虑以下两行:
r = requests.get("http://192.168.1.138:6666/scm/", auth=(self.username, self.password))
self.assertTrue(r.ok)
追溯说错误(NameError: name 'self' is not defined
)
发生在第二行(self.assertTrue(r.ok)
)。但是,情况并非如此,因为第一行是self
。如果未定义self
,我们就不会越过第一行。
因此,您发布的代码不是您运行的代码。
答案 3 :(得分:0)
这是一个老问题,但我想加上我的两分钱,因为这里没有提到。我同意其他人在原始代码中存在某种类型的拼写错误。仔细看看这段代码:
import unittest
import requests
class TestWriteFile(unittest.TestCase):
def setup(self):
self.username = 'dummy'
def test_scm_permission(self):
r = requests.get("http://192.168.1.138:6666/scm/", auth=(self.username, self.password))
self.assertTrue(r.ok)
乍一看代码看起来没问题(而且lint工具不会抱怨);但是,我写了设置,而不是 setUp (注意大写 U )。这会导致不在test_scm_permission上下文中定义self.username,因为python没有自动调用我的错误函数名称。如果你遇到这种类型的错误,可以检查这一点,但确定你已经正确定义了类成员。
答案 4 :(得分:0)
我有同样的问题,但没有自我。它是一个常规变量,在发生错误之前定义了该行。
显然是因为...... mixin标签和空格。
我用4个空格替换了所有标签,问题就消失了。
由于某些未说明的原因,我没有传统的缩进错误,而是有了这个。