如何断言一个类型等于给定的值

29

我正在为一个方法编写测试,并且我想验证该方法返回特定的类型。但是,当我尝试这样做时,我遇到了错误。

def search_emails(mail):  
  data = mail.uid('search')
  raw_email = data[0][1]  
  return raw_email

类型(raw_email)为:<class 'bytes'>

当我运行这个测试时:

def test_search_emails_returns_bytes():  
  result = email_handler.search_emails(mail)
  assert type(result) == "<class 'bytes'>"

我遇到了这个错误。我该如何陈述断言以使测试通过?或者有更好的编写测试用例的方法吗?

E       assert <class 'bytes'> == "<class 'bytes'>"

5
assert type(result) is bytesassert isinstance(result, bytes) 的意思是断言(Assertion)一个变量 result 的类型是 bytes。 - vaultah
4
isinstance(result, bytes) 的意思是判断变量 result 是否为字节类型。 - Morgan Thrapp
你正在将一个实际的 type 对象与一个字符串对象进行比较。 - PM 2Ring
5个回答

41
您可以使用is运算符来检查变量是否属于特定类型。
my_var = 'hello world'
assert type(my_var) is str

18

你需要使用isinstance函数,它是一种用于类型检查的内置函数

def test_search_emails_returns_bytes():  
  result = email_handler.search_emails(mail)
  assert isinstance(result, bytes)

2
在某些情况下,更喜欢使用 isinstance(X, Y) 而不是 type(X) is Y,因为 isinstance 也会将子类返回为 True - Roman Kovtuh

6
如果你想要检查某个对象是否是特定的类,isinstance并不能满足需求,因为即便是派生类,isinstance也会返回True而不是你想要检查的准确类。你可以通过以下方式获取类型字符串:
def decide_type(raw_prop):
    """Returns the name of a type of an object.
    Keep in mind, type(type("a")) is Type,
                  type(type("a").__name__) is Str
    """
    type_as_string = type(first_raw_prop).__name__
    return type_as_string

这将实际返回 'lst'、'int' 等内容。

在你的代码中,它可能会转换成如下形式:

assert type(result).__name__ == "bytes"

5

既然您提到正在使用的是方法,那么assertIsInstance可能会很方便:

import unittest

def myfunc(name):
    return type(name)

class TestSum(unittest.TestCase):
    def test_type(self):
        result = myfunc('Micheal')
        self.assertIsInstance(result, str)

unittest.main()

要查看断言方法列表,请向下滚动到此处


这不仅方便,而且在我看来,这是首选的方式。 - Boris Modylevsky

3

请随意发表不同意见,但此版本消除了变量求值类型的任何歧义:

result = "text"
self.assertEqual(type(result),type("text"))

1
我认为这个解决方案是最简单和容易的。 - Ray Ronnaret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接