为 属性 装饰器实施 Unittest

implementing Unittest for property decorator

我有这个代码可以收集一个人的名字。

class Person:

   #initializing the variables and giving them an empty string as a baseline.
    def __init__(self, first_name = '', last_name = ''):
        self.first_name = first_name
        self.last_name = last_name


    @property
    #getting first name and returning it for future use.
    def first_name(self):
        return self._first_name
    

    #setting the first name
    @first_name.setter
    def first_name(self, first_name):
        #capitalizing the first name.
        self._first_name = first_name.capitalize()


    @property
    #getting last name and returning it for future use.
    def last_name(self):
        return  self._last_name


    @last_name.setter
    #setting last name
    def last_name(self, last_name):
        #capitalizing last name    
        self._last_name = last_name.capitalize()

我想创建一个测试 class/first_name/property 装饰器的单元测试,我想看看我的做法是否正确?

import unittest
from person import Person
class TestPerson(unittest.TestCase):

    def test_first_name(self):
        Person._first_name = first_name('FakeName')
        self.assertEqual(Person._first_name(), 'FakeName')

    #updated code to fix errors pointed out. The first name works!
    #the last name does not.
    def test_last_name(self):
        testLast = Person('LastName')
        #Throws assertion error '' != 'LastName here. 
        self.assertEqual(testLast.last_name, 'LastName')

if __name__ == "__main__":
    unittest.main()

unittest 编码运行并通过,没有错误,但我想知道它是否使用了 属性 装饰器?在装饰器和单元测试方面我有点新手,所以我想确保这实际上是在使用 属性 装饰器而不是绕过它,或者我是否应该以其他方式格式化它(或使用 unittest.mock,正如其他一些论坛所建议的那样,但我根本不熟悉 .mock。

编辑:因为我在凌晨 3 点时非常聪明,所以我完全绕过了实际设置从 unittest 继承的 class。这已在第二个代码片段中进行了调整。还将我的 last_name 添加到 Person 和 unittest 以获取有关两者应如何交互的更多信息。

编辑 2:所有代码都已根据建议的编辑进行了调整。谢谢大家!会继续慢慢修正我的错误哈​​哈

首先,让我们在担心测试之前修复 class。

class Person:

    def __init__(self, first_name=''):
        self.first_name = first_name

    @property
    def first_name(self):
        return self._first_name
    
    @first_name.setter
    def first_name(self, first_name):
        self._first_name = first_name.capitalize()

    @property
    def last_name(self):
        return  self._last_name

    @last_name.setter
    def last_name(self, last_name):
        #capitalizing last name    
        self._last_name = last_name.capitalize()

只有 getter 和 setter 直接与 _first_name 属性交互,属性 名称本身应该是 public 接口的一部分(即 而不是 _ 为前缀)。 (请注意,属性 和支持属性不能共享相同的名称。)

现在,测试:

import unittest
from person import Person

class TestPerson(unittest.TestCase):
    def test_first_name(self):
        p = Person('fakeName')
        self.assertEqual(p.first_name, 'FakeName')


if __name__ == "__main__":
    unittest.main()

您需要创建 Person 的实例,然后检查 属性 返回的值是否与预期名称匹配。对于此示例,我将 non-capitalized 名称传递给 Person 以检查 setter 是否按预期将其大写。

此外,测试方法必须是 unittest.TestCase 的(子 class 的)实例方法,以便 unittest.main 找到并 运行 它。 main 寻找适当命名的 classes,实例化它们,然后 运行s 使用这些实例适当命名的方法。