我正在尝试用于pytest-mock嘲笑。mock该库本质上是和的插件/包装器patch。
我的问题定义为:
我有一个mymodule.py使用 SQL Alchemy 的应用程序 ( )。基本上,有一个函数定义 SQL Alchemy 中的一些对象并返回包含这些对象的字典。
def some_function1():
# some code
from sqlalchemy import create_engine, MetaData, Table
engine = create_engine(f"mysql+pymysql://{username}:{password}@{host}:{port}")
meta = MetaData(engine)
my_table = Table(
'my_table',
meta,
autoload=True,
schema="some_schema"
)
db_tools = {"engine": engine, "table": my_table}
return db_tools
Run Code Online (Sandbox Code Playgroud)
然后,第二个函数将该输出字典作为输入并使用它们:
def some_function2(db_tools, data):
sql_query = db_tools["table"].insert().values(data)
db_tools["engine"].execute(sql_query)
# some more code
Run Code Online (Sandbox Code Playgroud)
所以现在我正在编写单元测试,并且我不想实际与真实的数据库进行通信。所以我只需要嘲笑所有sqlalchemy相关的东西。到目前为止,我已经成功模拟create_engine,MetaData并Table通过执行以下操作:
mocker.patch(
'my_module.create_engine',
return_value=True
)
mocker.patch(
'my_module.MetaData',
return_value=True …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的闪亮应用程序开发单元测试,该应用程序是使用golem框架和shinyv1.5.0 制作的。
Golem 附带了一个推荐的测试文件,其中涵盖了非常基本的 UI 测试。然而,我更关心测试所有模块的服务器端。因此,就像您对常规 R 包中的每个函数进行测试一样,我想在我闪亮的应用程序中测试每个模块。
\n我知道有一个testModule功能正在开发中,但它没有包含在最新的闪亮 CRAN 版本中(这正是我正在使用的版本)。只有一个testServer函数,但我发现的所有示例似乎都在测试文件中定义了模块服务器端。当模块是包的一部分时,我找不到模块测试的示例。
所以我想做的基本上是一个位于内部的测试tests/testthat/test-my_module.R,看起来像这样:
\ntest_that("The module receives its input", {\n shiny::testServer(\n app = mypackage::my_module_server,\n args = list(),\n session = MockShinySession$new(), {\n session$setInputs(some_input = 100)\n expect_equal(output$some_output, 50)\n })\n})\nRun Code Online (Sandbox Code Playgroud)\n但是,这会引发错误:
\nError in UseMethod("as.shiny.appobj", x) : \n m\xc3\xa9todo n\xc3\xa3o aplic\xc3\xa1vel para 'as.shiny.appobj' aplicado a um objeto de classe "function"\nRun Code Online (Sandbox Code Playgroud)\n这基本上表明指定的方法在应用于函数类对象时不起作用。
\n我在这里错过了什么吗?
\n希望能讨论一下在将闪亮的应用程序开发为包时如何进行测试。
\n我正在编写一个使用一些lubridate函数的函数。
但是,我不确定如何%within%从 lubridate 导入该函数。通常这很容易,因为我只使用 lubridate::function 。当我使用 %within% 运算符尝试此操作时,这不起作用。有没有办法在不加载整个包的情况下使用包中的运算符?
仅使用基本 R 功能/工具创建二叉树的最佳方式是什么(假设在这种情况下,最佳意味着“创建或访问的最快方式”)?我假设某种形式的递归和/或使用环境操作的数据结构是必要的?
更重要的是,我希望二叉树的创建被参数化为应该生成什么类型的树(例如:一个完美的,其中所有节点都有两个孩子?)。
例子:
my_tree <- grow_tree(perfect = FALSE, max_height = 3)
print(my_tree)
my_tree[1]
1
my_tree[1][left]
2
my_tree[1][right]
3
my_tree[1][left][left]
4
Run Code Online (Sandbox Code Playgroud)
应该是一棵树的表示,看起来像:
1
/ \
2 3
/
4
Run Code Online (Sandbox Code Playgroud)
注意:随意使用 S3 或 S4,考虑到它们是在基础 R 中提供的。但是,如果没有它们,看到解决方案会很有趣。
r ×3
binary-tree ×1
golem ×1
lubridate ×1
pytest ×1
pytest-mock ×1
python ×1
shiny ×1
testthat ×1
unit-testing ×1