gpt4 book ai didi

Python:unittest,AttributeError 尝试从测试类的 __init__ 访问自身属性

转载 作者:行者123 更新时间:2023-12-01 08:47:16 26 4
gpt4 key购买 nike

使用单元测试测试类的属性时遇到一些问题。这是一个简单的例子

示例类:

class Company(object):
def __init__(self, name):
self.name = name

此类的 TestSuite 通过一个简单的案例来检查其 name 属性值:

import unittest
class CompanySuite(unittest.TestCase):

def setUp(self):
self.company = Company

def tearDown(self):
del self.company

def test_company_name(self):
check_name = "NewestCompany"
self.assertEqual(check_name, self.company.name, "Name isn't correct")

模块:

if __name__ == "__main__":
firm = Company("NewestCompany")
print(firm.name)
unittest.main()

总而言之,它给出了主模块的执行结果:

NewestCompany
E
======================================================================
ERROR: test_company_name (__main__.CompanySuite)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:/test/main 2.py", line 19, in test_company_name
self.assertEqual(check_name, self.company.name, "Name isn't correct")
AttributeError: type object 'Company' has no attribute 'name'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

找不到问题出在哪里 - 如何从 __init__ 正确访问此 name 属性?

<小时/>

编辑:

好吧,事实证明它可以通过以下方式修复:

  1. SetUp 方法中向 Company 添加固定的 name 属性:

    def setUp(self):
    self.company = Company(name="NewestCompany")
  2. 添加具体实例作为company值:

    def setUp(self):
    self.company = firm

更新后的问题 - 有没有办法定义 SetUp 以便它与实例一起使用,这将根据 main 中的用户进行定义?

最佳答案

正在做self.company = Company(name="NewestCompany")setUp是每个测试的正确初始化方法。 (因为它是在该类中的每个测试之前执行的。)

当您创建firm时在if __name__ == "__main__": ,然后self.company = firmsetUp将引用相同的全局 firm所有测试的实例。因此,如果您在一个测试中更改某个属性,它将影响其他测试中的该属性。例如第二次测试test_company_name_two将会失败:

class CompanySuite(unittest.TestCase):

def setUp(self):
self.company = firm # this is the global firm instance, created just once in main

def tearDown(self):
del self.company # this won't prevent the failure in test_company_name_two
# since it's the same `firm` instance in setUp()

def test_company_name(self):
check_name = "NewestCompany"
self.assertEqual(check_name, self.company.name, "Name isn't correct")
self.company.name = "Newer Name" # changes the global `firm` instance

def test_company_name_two(self): # this will fail since company name is now "Newer Name"
check_name = "NewestCompany"
self.assertEqual(check_name, self.company.name, "Name isn't correct")

您编辑中的选项 1 是解决方案:

  1. Add fixed name attribute to the Company in SetUp method:

    def setUp(self):
    self.company = Company(name="NewestCompany")

这会为每个测试创建一个新的公司实例。

<小时/>

So updated question - is there any way to define SetUp so it works with instances, that will be defined depend on the user in main?

是的,您编辑中的第二个选项可以做到这一点;但错误的是。你想实现什么目标?如果您希望公司的名称或其他属性被全局定义,您始终可以将其作为全局或 if-main 以及您希望在测试实例中通用的任何其他属性一起放置:

if __name__ == "__main__":
FIRM_NAME = "NewestCompany"
FIRM_OTHER_ATTR = "something else"
unittest.main()


class CompanySuite(unittest.TestCase):
def setUp(self):
self.company = Company(FIRM_NAME, other_attr=FIRM_OTHER_ATTR)

关于Python:unittest,AttributeError 尝试从测试类的 __init__ 访问自身属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53253322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com