当前位置: 首页 > 面试题库 >

在python单元测试中模拟类属性的更好方法

叶鸿
2023-03-14
问题内容

我有一个定义类属性的基类和一些依赖它的子类,例如

class Base(object):
    assignment = dict(a=1, b=2, c=3)

我想用不同的 分配 对这个类进行单元测试,例如空字典,单个项目等。当然这是极其简化的,这与重构我的类或测试无关

我提出的(pytest)测试最终是

from .base import Base

def test_empty(self):
    with mock.patch("base.Base.assignment") as a:
        a.__get__ = mock.Mock(return_value={})
        assert len(Base().assignment.values()) == 0

def test_single(self):
    with mock.patch("base.Base.assignment") as a:
        a.__get__ = mock.Mock(return_value={'a':1})
        assert len(Base().assignment.values()) == 1

这感觉很复杂而且很笨拙-我什至还不完全了解它为什么起作用(尽管我对描述符很熟悉)。模拟会自动将类属性转换为描述符吗?

感觉更合乎逻辑的解决方案不起作用:

def test_single(self):
    with mock.patch("base.Base") as a:
        a.assignment = mock.PropertyMock(return_value={'a':1})
        assert len(Base().assignment.values()) == 1

要不就

def test_single(self):
    with mock.patch("base.Base") as a:
        a.assignment = {'a':1}
        assert len(Base().assignment.values()) == 1

我尝试过的其他变体也不起作用(测试中的分配保持不变)。

模拟类属性的正确方法是什么?有没有比上述方法更好/更容易理解的方法?


问题答案:

base.Base.assignment简单地用一个Mock对象代替。您 提出 通过添加它描述__get__方法。

这有点冗长,有些不必要。您可以base.Base.assignment直接直接设置:

def test_empty(self):
    Base.assignment = {}
    assert len(Base().assignment.values()) == 0

当然,在使用测试并发时,这不太安全。

要使用PropertyMock,我将使用:

with patch('base.Base.assignment', new_callable=PropertyMock) as a:
    a.return_value = {'a': 1}

甚至:

with patch('base.Base.assignment', new_callable=PropertyMock, 
           return_value={'a': 1}):


 类似资料:
  • 我有一个调用流api的异步函数。为这个函数编写单元测试的最佳方法是什么?必须模拟api响应。 我尝试使用aiounittest,并使用unittest的mock。但是这调用了实际的api,而不是得到模拟的响应。也尝试pytest.mark.asyncio注释,但这一直给我的错误-协程从未等待。我已经验证pyest-asyncio已经安装。 我正在使用VS代码和Python 3.6.6 以下是相关的

  • 我用Mockito进行了Java测试: Kotlin.TypeCastException:null不能强制转换为非null类型java.util.HashMap 如何正确模拟属性?

  • 我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient

  • 问题内容: 我在Python中使用时遇到了一些困难: 测试实际上返回正确的值,但它是Mock对象,不是。您如何在Python库中模拟属性? 问题答案: 您需要使用和: 这意味着:调用时,在该调用的返回值上,为属性设置a以返回value 。

  • 问题内容: 我想为与HTTP相关的所有测试都包括一个Web服务器。它不需要非常复杂。我希望不要依赖在线。因此,我可以测试程序的某些选项。 启动服务器 使用适当的mime类型,响应代码等创建一些资源(URI)。 运行测试(最好也不必为每个测试都启动服务器) 关闭服务器。 此代码上的任何提示都将有所帮助。我用BaseHTTPServer尝试了几件事,但还没有成功。鼻子测试命令似乎无限期地等待。 谢谢你

  • 我还尝试将模拟转换为文档,如下所示 但这会在代码实现内部访问MongoCollection时产生NullpointerException异常。 这两个我都试过了 null 我厌倦了用java编写相同的测试,并在其中进行泛型的转换。 有人在Kotlin有嘲弄泛型类的经验吗?