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

Cpp*_*ner 6 python unit-testing

编辑

所以我再次尝试,调用一个新文件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()
Run Code Online (Sandbox Code Playgroud)

运行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
Run Code Online (Sandbox Code Playgroud)

我不认为我需要覆盖__init__功能,是吗?是什么导致了这个?为什么self没有定义?我已经宣布了我的超类unittest.TestCase

谢谢.

我基本上从官方样本中学到了它:Unittest - Basic Example

DSM*_*DSM 8

我不确定问题的来源 - 无论是复制错误还是错误的test.py正在执行[更新:或者一些混合的制表符和空格问题,我永远无法弄清楚那些被标记的时候当他们没有] - 但根本原因几乎肯定是缩进错误.

请注意,错误消息是

NameError: name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

并不是

NameError: global name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

@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
Run Code Online (Sandbox Code Playgroud)

与

~/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
Run Code Online (Sandbox Code Playgroud)


Rik*_*ggi 6

我不认为你展示的是实际执行的代码.

我和其他人相信,出于以下几个原因:

  • 如果self.assertTrue(r.ok)失败那么之前的行也将.因此self.assertTrue(r.ok)不会执行.(正如David Heffernan所说)
  • 因为你的代码看起来很好.

我会说你可能犯了这样的拼写错误:

def test_scm_permission(self):
                         ^
                         |
         and wrote something here that's not self
Run Code Online (Sandbox Code Playgroud)

在某个文件中执行而不是您正在显示的文件.

看看这个例子:

# test.py
class MyClass:

    def func(sel):    # typo error here
        self.name = 10


obj = MyClass()
obj.func()
Run Code Online (Sandbox Code Playgroud)

当我试图跑:

$ 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
Run Code Online (Sandbox Code Playgroud)

有类似于你的追溯.

注意:如果我没有计算错误self.assertTrue(r.ok)是在第18行,而不是第19行(这是你的追溯中显示的数字).

  • 我认为你或多或少都是正确的,但如果错字在那里,当它试图找到`self.username`时,就会失败. (2认同)