为 属性 装饰器实施 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 使用这些实例适当命名的方法。
我有这个代码可以收集一个人的名字。
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 使用这些实例适当命名的方法。