使用 testbook 测试 Jupyter 笔记本单元时如何修补 input()?

2023-11-24

我参与的一个项目使用testbook测试 Jupyter Notebook 的代码单元。Patching工作正常 — 除非要测试的代码要求用户输入input()。我只是不知道如何正确修补它。

使用的版本:Python:3.8.10,测试手册:0.4.2

要在 Jupyter 代码单元中测试的代码,标记为name_checking:

def fix(text):
    return text.strip().title()

def check(text):
    return len(text) > 1

firstname = input("What's your first name?")
lastname = input("What's your last name?")
fixed_first = fix(firstname)
fixed_last = fix(lastname)
if check(fixed_first) and check(fixed_last):
    print(f"Your name is {fixed_first} {fixed_last}.")
else:
    print("You entered an invalid name.")

尝试1:测试代码补丁builtins.input

@testbook(path)
def test_name_checking1(tb): # execute cell tagged "name_checking"
    with tb.patch("builtins.input") as mock_input:
        mock_input.return_value = ["   haRrY   ", "  pOtter "]
        result = tb.execute_cell("name_checking")
        assert tb.cell_output_text("name_checking") == "Harry"

这失败了:

E                     8 
E               ----> 9 firstname = input("What's your first name?")
E                    10 lastname = input("What's your last name?")
E                    11 
E               
E               ~/proj/.venv/lib/python3.8/site-packages/ipykernel/kernelbase.py in raw_input(self, prompt)
E                   976         """
E                   977         if not self._allow_stdin:
E               --> 978             raise StdinNotImplementedError(
E                   979                 "raw_input was called, but this frontend does not support input requests."
E                   980             )
E               
E               StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.
E               StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.
../.venv/lib/python3.8/site-packages/testbook/client.py:135: TestbookRuntimeError

尝试2:测试代码补丁ipykernel.kernelbase.Kernel.raw_input

@testbook(path)
def test_name_checking2(tb):
    with tb.patch("ipykernel.kernelbase.Kernel.raw_input") as mock_input:
        mock_input.return_value = ["   haRrY   ", "  pOtter "]
        result = tb.execute_cell("name_checking")
        firstname = tb.ref("firstname")
        assert tb.cell_output_text("name_checking") == "Harry"

这失败了:

tb = <testbook.client.TestbookNotebookClient object at 0x7f74aaca2af0>

    @testbook(path)
    def test_name_checking2(tb): # execute cell tagged "name_checking"
        with tb.patch("ipykernel.kernelbase.Kernel.raw_input") as mock_input:
            mock_input.return_value = ["   haRrY   ", "  pOtter "]
            result = tb.execute_cell("name_checking")
            firstname = tb.ref("firstname")
            print(firstname)
>           assert tb.cell_output_text("name_checking") == "Harry"
E           AssertionError: assert 'You entered an invalid name.' == 'Harry'
E             - Harry
E             + You entered an invalid name.

03-functions/tests/test_name_checking.py:33: AssertionError
----------------------------------------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------------------------------------
"<MagicMock name='raw_input()' id='139650606478576'>"

有谁知道必须修补什么或如何正确修补input()?


我通过深入研究 testbook 的代码并了解有关修补的更多信息找到了解决方案:

  • 打补丁ipykernel.kernelbase.Kernel.raw_input是正确的方法

  • but:提供返回值input()使用side_effect论证,不mock_input.return_value

正确的测试代码:

@testbook(path)
def test_name_checking(tb):
    with tb.patch(
        "ipykernel.kernelbase.Kernel.raw_input",
        side_effect=["   haRrY   ", "  pOtter "],
    ) as mock_input:
        tb.execute_cell("name_checking")
        assert tb.cell_output_text("name_checking") == "Your name is Harry Potter."
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 testbook 测试 Jupyter 笔记本单元时如何修补 input()? 的相关文章

随机推荐

  • 复合类型数组的正确语法

    CREATE TYPE pencil count AS pencil color varchar 30 count integer CREATE TABLE pencils id serial pencils pencil count IN
  • ggplot2 按组绘制曲线下阴影面积

    我正在尝试对两条曲线下的区域进行着色 我想得到与中完全相同的图 尽管没有阈值 上一篇文章 唯一的区别是我想使用geom line 代替stat density 有什么办法可以做到这一点吗 提前致谢 我已经尝试过该帖子中建议的方法 但是当我使
  • 我应该向 App Store 发布一个包含打印语句的应用程序吗?

    我打算很快将我的应用程序发布到 App Store 在 TestFlight 之后 我有很多视图控制器print其中的陈述 这print语句用于测试目的 调试器 用户永远不会看到它们 发布后 如果我在应用程序中包含或不包含打印语句 会有什么
  • 如何发布选择列表中的所有选项?

    我有一个选择多个列表 其中包含一些项目 它是 ACL 的 IP 地址列表 人们可以添加 删除 IP 然后保存列表 但是 除非您选择列表中的某个项目 POST selectName 不包含任何值 我怎样才能做到这一点 我知道我可以用 java
  • Matlab/CUDA:海浪模拟

    我学过 模拟海水 Jerry Tessendorf 的文章并尝试对统计波模型进行编程 但我没有得到正确的结果 我不明白为什么 In my program I tried only to create a wave height field
  • Azure 移动 Web 服务测试页的身份验证

    开发 Azure 移动服务时 我可以在本地运行时运行测试页面 如果我按下 尝试 按钮 我可以测试我的 api 但是当发布到 Azure 时 我需要进行身份验证才能使用 尝试 按钮 我的问题是测试页发布到云端时的用户名和密码是什么 据我所知
  • ListView ManipulationCompleted 事件在手机上不起作用

    我在 Windows 10 UWP 应用程序中有以下代码 MyListView ManipulationMode ManipulationModes TranslateX MyListView ManipulationStarted s e
  • 如何在android中的sqlite中实现一对多对象数据库

    我很新SQLite and SQL我正在努力解决以下问题 我的应用程序将显示社区成员列表 如果我点击某个成员 我可以看到该成员发布的帖子列表 帖子是一个包含名称 时间和消息的对象 我怎样才能将其存储在SQLite数据库 以便我可以通过以下方
  • 阴影穿透后代组合器 '/deep/' ,包括 '::shadow' 伪元素,已被弃用,那么我们如何穿透 Shadow DOM?

    假设我们有一些 CSS 代码 例如动画 CSS 加载器 我们希望在所有使用 Shadow DOM 的 Web 组件中使用它 如果我们无法像使用 Shadow DOM 那样穿透 Shadow DOM 我们如何重新使用这个 CSS 代码 sha
  • Python 找不到模块

    给定以下在 PyDev 中创建的 python 项目 algorithms init py neighborhood init py neighbor connector py init py manager py references p
  • package.json 中的依赖是什么 - nodejs

    在我的节点项目中 将独立模块构建到以 main js 作为入口点的文件夹中 并在与不同文件相同的文件夹中找到该模块的帮助程序 Ex Aggregator package json main js node modules helper1 j
  • 无法启动模拟应用程序:未知错误

    OS X 10 5 7 正版 Mac Xcode 3 1 3 iPhone SDK 3 0 当我尝试在模拟器中执行 iPhone 应用程序时 我收到了可怕的错误消息 Failed to launch simulated applicatio
  • 从 MSBuild 脚本发出 HTTP 请求

    我正在寻找一种从 msbuild 脚本中点击 Web 应用程序 Restful 服务 URL 来触发远程过程的方法 除了调用外部应用程序之外 还有什么方法可以做到这一点吗 理想情况下 如果服务返回 http 200 以外的其他内容 我正在寻
  • 如果 NUL 终止符不在切片末尾,如何从以 NUL 终止的字节切片中获取“&str”?

    While CStr通常用于 FFI 我正在阅读 u8 它以 NUL 结尾 并确保是有效的 UTF 8 因此不需要检查 然而 NUL 终止符不一定位于切片的末尾 有什么好的方法可以得到这个 str 建议使用CStr from bytes w
  • 如何在 Firebase 上存储数据 - Delphi XE 10

    从 Embarcadero Delphi XE 10 连接到 Google 的 Firebase DBaaS 的最佳方式是什么 我不知道如何从 AnyDAC 做到这一点 或者如果存在一个组件 我在搜索中找不到一个 有什么帮助吗 谢谢 Fir
  • 如何仅在选中复选框时显示输入字段?

    基本上 我只想在选中复选框时显示这些字段 如果未选中该字段 则消失
  • Mockito:模拟私有字段初始化

    如何模拟正在内联初始化的字段变量 class Test private Person person new Person public void testMethod person someMethod 这里我想嘲讽一下person som
  • elasticsearch 分析器 - 小写和空格分词器

    如何创建一个映射来标记空格上的字符串并将其更改为小写以进行索引 这是我当前的映射 它通过空格进行标记 我无法理解如何将其小写并搜索 查询 相同的 mappings my type properties title type string a
  • CoreNFC 用于卡模拟?

    iOS 11 SDK 中引入了 CoreNFC CoreNFC 可以用于 iOS 上的智能卡模拟吗 Apple CoreNFC 文档 对于智能卡仿真 我们需要send通过 NFC 模块读取卡的数据 如 PAN CVV2 根据 Apple 的
  • 使用 testbook 测试 Jupyter 笔记本单元时如何修补 input()?

    我参与的一个项目使用testbook测试 Jupyter Notebook 的代码单元 Patching工作正常 除非要测试的代码要求用户输入input 我只是不知道如何正确修补它 使用的版本 Python 3 8 10 测试手册 0 4