首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态Mocks比静态Mocks的好处?

动态Mocks比静态Mocks的好处?
EN

Software Engineering用户
提问于 2020-09-01 04:55:09
回答 1查看 697关注 0票数 1

我不确定静态和动态模拟是否是用来描述这种比较的术语,但我从静态和动态模拟的类型手工制作的模型很容易获得了这个术语。总之,动态模拟是动态生成的代理,而静态模拟是预先实现的。对于给定此抽象Repository的Python示例,Value域对象和示例DatabaseRepository实现:

代码语言:javascript
复制
class Value:
    ...

class Repository(ABC):
    @abstractmethod
    def read_value(value_id: str) -> Value:
        pass

class DatabaseRepository(Repository):
    def __init__(self):
        self.database_client = ...

    def read_value(value_id: str) -> Value:
        # Use `self.database_client` and `value_id` to fetch a parsable `Value`.
        ...

静态模拟看起来像:

代码语言:javascript
复制
from abc import ABC, abstractmethod

class MockRepository(Repository):
    def read_value(_: str) -> Value:
        return Value(...)  # Ignores `value_id` and returns predefined `Value` for mocking purpose.

static_mock = MockRepository()

动态模拟如下所示:

代码语言:javascript
复制
from unittest.mock import Mock

dynamic_mock = Mock(spec=Repository)
dynamic_mock.read_value.return_value = Value(...)

在我使用过的代码库中,我很少看到静态模拟。然而,静态模拟似乎带来了许多好处,其中一个主要的优点是在编译时安全地用静态类型语言(或者用Python )构建模拟对象(或者用mypy这样的类型检查器执行安全性)。

动态模拟的唯一好处似乎是简洁(这两个链接也提到了),虽然这是一个有效的好处,但是与静态模拟相比,动态模拟所能做的事情是否是我所缺少的呢?一种特定语言的设计(例如静态类型和动态类型)是否会使这个比较尺度倾斜?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2020-09-02 08:04:18

你这里有个存根。存根用于将值注入其他对象。这些值可用于在所测试的函数中执行不同的逻辑路径。返回true,返回false,抛出异常。

动态创建存根(被认为是可配置的存根)只会保持代码库的整洁,并减少了管理大量助手类的需要。硬编码存根是为一个测试定制的,所以您可以想象一下,在一个包含1000个测试的代码库中,它会是如何运行的。一旦测试套件变得更大,硬编码存根的管理就会出现问题。

模仿是不一样的。他们记得如何使用它们,并且可以作为测试的一部分进行验证;也就是说,SaveToDatabase()方法被调用了三次。

有一本很棒的书叫做xUnit测试模式,它包含了你需要知道的关于这个主题的所有东西。它真的很好,应该不难找到。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/415428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档