在进行单元测试时,未定义名称“self”?

时间:2012-03-02 22:41:43

标签: python unit-testing

修改

所以我再次尝试使用一个名为test2.py的新文件,它可以正常运行。我打包了repomantest.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

5 个答案:

答案 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个空格替换了所有标签,问题就消失了。

由于某些未说明的原因,我没有传统的缩进错误,而是有了这个。