python单元测试我的密码验证码[关闭]

问题描述 投票:2回答:1

我有这个功能代码:

class PasswordChecker(object):

 passwords = ["aD23"]

 def check(self, passwords):
     if not passwords:
         raise NameError('You have not entered any password')
     else:
         pass

而这个测试代码:

import unittest

from app.passwordchecker import PasswordChecker

class TestPasswordChecker(unittest.TestCase):
  def setUp(self):
    self.pswd = PasswordChecker()

  def test_password_checker_raises_nameerror_for_noargs(self):
    self.assertRaises(NameError, self.pswd.check, [])

我希望通过在[][items]替换self.assertRaises()来使测试失败时,它应该抛出一个NameError - You have not entered any password。但是,它会抛出一个不同的错误,这意味着我的代码有问题。请帮忙

python python-3.x unit-testing tdd
1个回答
1
投票

您看到的行为似乎是正确的:

self.assertRaises(NameError, self.pswd.check, [])

你用空列表调用check not passwordsTrueNameError被提出。就测试而言,这是预期的行为,一切都很顺利。

现在,如果您已将行更改为例如:

self.assertRaises(NameError, self.pswd.check, ['123'])

你会看到:

======================================================================
FAIL: test_password_checker_raises_nameerror_for_noargs (test_check.TestPasswordChecker)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/so/test_check.py", line 10, in test_password_checker_raises_nameerror_for_noargs
    self.assertRaises(NameError, self.pswd.check, ['123'])
AssertionError: NameError not raised

因为该方法运行,并返回None,但测试表明它预计会引发NameError异常。

你的测试看起来像这样:

...
def test_password_checker_raises_nameerror_for_noargs(self):
    self.assertRaises(NameError, self.pswd.check, [])

def test_password_checker_returns_none_with_args(self):
    self.assertIsNone(self.pswd.check(['123']))
...

对于没有args,我们期望NameError被提升。通过传递参数,我们期望返回None


旁注:NameError具有尝试使用未知变量的通常含义。也许ValueError会更合适。或者您可能想要定义自己的异常。

© www.soinside.com 2019 - 2024. All rights reserved.