如何断言类型等于给定值

问题描述 投票:0回答:5

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

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'>"
python python-3.x pytest
5个回答
42
投票

您可以使用

isinstance
函数来检查变量是否属于特定类型:

my_var = 'hello world'
assert isinstance(my_var, str)

18
投票

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

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

6
投票

如果你想检查某个东西是否属于某个类,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()

有关断言方法的列表,请向下滚动此处


3
投票

随意不同意,但这个版本消除了变量评估类型的任何歧义:

result = "text"
self.assertEqual(type(result),type("text"))
© www.soinside.com 2019 - 2024. All rights reserved.