gpt4 book ai didi

python - 单元测试实现 Python 属性

转载 作者:行者123 更新时间:2023-12-01 04:54:18 26 4
gpt4 key购买 nike

我有一个具有以下属性clusters的类:

import numpy as np

class ClustererKmeans(object):

def __init__(self):
self.clustering = np.array([0, 0, 1, 1, 3, 3, 3, 4, 5, 5])

@property
def clusters(self):
assert self.clustering is not None, 'A clustering shall be set before obtaining clusters'
return np.unique(self.clustering)

我现在想为这个简单的属性编写一个单元测试。我从以下内容开始:

from unittest import TestCase, main
from unittest.mock import Mock

class Test_clusters(TestCase):

def test_gw_01(self):
sut = Mock()
sut.clustering = np.array([0, 0, 1, 1, 3, 3, 3, 4, 5, 5])
r = ClustererKmeans.clusters(sut)
e = np.array([0, 1, 3, 4, 5])
# The following line checks to see if the two numpy arrays r and e are equal,
# and gives a detailed error message if they are not.
TestUtils.equal_np_matrix(self, r, e, 'clusters')

if __name__ == "__main__":
main()

但是,这不会运行。

TypeError: 'property' object is not callable

接下来,我将行 r = ClustererKmeans.clusters(sut) 更改为以下内容:

r = sut.clusters

但是,我再次遇到意外错误。

AssertionError: False is not true : r shall be a <class 'numpy.ndarray'> (is now a <class 'unittest.mock.Mock'>)

有没有一种简单的方法可以使用单元测试框架来测试 Python 中属性的实现?

最佳答案

call property您可以直接将原始代码中的 ClustererKmeans.clusters(sut) 替换为 ClustererKmeans.clusters.__get__(sut)

即使我是一个 mock 的热情恕我直言,这个案例也不是一个应用它的好例子。模拟对于删除类和资源的依赖关系很有用。在您的情况下,ClustererKmeans有一个空的构造函数,并且没有任何依赖关系需要打破。您可以通过以下方式做到这一点:

class Test_clusters(TestCase):
def test_gw_01(self):
sut = ClustererKmeans()
sut.clustering = np.array([0, 0, 1, 1, 3, 3, 3, 4, 5, 5])
np.testing.assert_array_equal(np.array([0, 1, 2, 3, 4, 5]),sut.clusters)

如果您要使用模拟,则可以使用 unittest.mock.patch.object 修补 ClustererKmeans() 对象:

def test_gw_01(self):
sut = ClustererKmeans()
with patch.object(sut,"clustering",new=np.array([0, 0, 1, 1, 3, 3, 3, 4, 5, 5])):
e = np.array([0, 1, 3, 4, 5])
np.testing.assert_array_equal(np.array([0, 1, 2, 3, 4, 5]),sut.clusters)

...但是当 python 为你提供了一种简单直接的方法时,为什么还要使用 patch 呢?

使用模拟框架的另一种方法应该是信任numpy.unique并检查该属性是否正确的工作:

@patch("numpy.unique")
def test_gw_01(self, mock_unique):
sut = ClustererKmeans()
sut.clustering = Mock()
v = sut.clusters
#Check is called ....
mock_unique.assert_called_with(sut.clustering)
#.... and return
self.assertIs(v, mock_unique.return_value)

#Moreover we can test the exception
sut.clustering = None
self.assertRaises(Exception, lambda s:s.clusters, sut)

对于一些错误,我深表歉意,但我没有测试代码。如果您通知我,我会尽快修复所有问题。

关于python - 单元测试实现 Python 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27784120/

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