对模块进行单元测试时如何模拟导入的子例程

2024-04-28

考虑一个导出连接到互联网并返回结果的子例程的模块:

unit module A;

sub download is export {
     "result from internet"  # Not the actual implementation, obviously.
}

另一个导入并调用该子例程的模块:

use A;  # imports &download into this lexical scope
unit module B;

sub do-something is export {
     download().uc ~ "!!"   # Does something which involves calling &download
}

现在我想为模块编写单元测试B.
但我不希望测试真正连接到互联网;我希望他们使用子例程的模拟版本download这是由我的测试脚本控制的:

use Test;
plan 2;

use B;

my $mock-result;
my &mock-download = -> { $mock-result }

# ...Here goes magic code that installs &mock-download
# as &download in B's lexical scope...

$mock-result = "fake result";
is do-something(), "FAKE RESULT!!", "do-something works - 1";

$mock-result = "foobar";
is do-something(), "FOOBAR!!", "do-something works - 2";

问题是缺少覆盖子的魔术代码download...

在 Perl 5 中,我认为使用 glob 赋值可以很容易地实现这一点,或者在以下命令的帮助下甚至更好子::覆盖 https://metacpan.org/pod/Sub::Override or 测试::模拟模块 https://metacpan.org/pod/Test::MockModule.

但在 Perl 6 中,模块的词法范围B编译完成后关闭,因此在测试脚本运行时不再可以修改(如果我错了,请纠正我)。所以这个方法看起来不太可能。

那么,如何在 Perl 6 中解决这一任务呢?
IE。如何编写单元测试B::do-something,而不让它调用真实的A::download?


最简单的方法可能是使用wrap中描述的https://docs.perl6.org/language/functions#Routines https://docs.perl6.org/language/functions#Routines但其前提条件是use soft;防止内联的杂注。你需要use soft;在模块A中:

unit module A;
use soft;

sub download is export {
    "result from internet";
}

模块B:

unit module B;
use A;

sub do-something is export {
    download.uc ~ "!!";
}

和测试脚本:

use Test;
use A;
use B;

&download.wrap({
    "mock result";
});

is do-something, "MOCK RESULT!!", "mock a 'use'd sub";
# ok 1 - mock a 'use'd sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对模块进行单元测试时如何模拟导入的子例程 的相关文章

  • QUnit 不会运行测试

    我刚刚开始使用 QUnit 并遇到问题 我目前正在使用 TypeScript 它是一个 JavaScript 编译器 我在与我的主要课程结构平行的课程中进行测试 在每个类中 我都有一个名为 runTests 的函数 为了执行这些测试 我循环
  • 单例可以促进遗留代码库中的单元测试。好主意好不好?

    各位 我有一个庞大的遗留 Net 代码库 并且我正在尝试向团队引入单元测试 他们是好人 但这对他们来说是全新的 老实说 这对我来说也是相当新的 问题之一是代码库大量使用 System IO 中的静态类 有大量的内部静态类库 并且类不会写入接
  • 如何知道您的单元测试装置是否“尺寸合适”?

    您如何知道 测试夹具 的尺寸是否合适 我所说的 测试夹具 是指一个包含大量测试的类 我在测试装置中一直注意到的一件事是它们变得有点冗长 鉴于它们也可能不够详细 您如何了解单元测试的大小是否合适 我的假设是 至少在 Web 开发的背景下 您应
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 使用原始类型模拟案例类

    考虑以下类型结构 trait HasId T def id T case class Entity id Long extends HasId Long 比方说 我们想在一些测试中模拟实体类 val entityMock mock Enti
  • PowerMock + Mockito VS 单独 Mockito

    谁能总结一下 到底有哪些功能可以让您在 Mockito 之上添加 PowerMock 到目前为止我已经找到了这些 模拟静态 最终和私有方法 删除静态初始化器 允许在没有依赖注入的情况下进行模拟 我不清楚这一点 你能详细说明一下吗 它还添加其
  • 如何运行传递给模拟方法的 lambda 函数?

    我想知道是否可以运行作为参数传递给模拟函数的 lambda 函数 并在调用模拟方法时运行它 我正在使用 Mockk 我想象代码是这样的 class DataManager fun submit lambda Int gt Unit val
  • 带有 HttpContext 的 ASP.NET MVC 单元测试控制器

    我正在尝试为我的一个控制器编写一个单元测试 以验证视图是否正确返回 但该控制器有一个访问 HttpContext Current Session 的基本控制器 每次我创建控制器的新实例时 都会调用 basecontroller 构造函数 并
  • 使用 Retrofit2 和 Mockito 或 Robolectric 进行 Android 单元测试

    我可以测试 Retrofit2beta4 的真实响应吗 我需要 Mockito 或 Robolectic 吗 我的项目中没有活动 它将是一个库 我需要测试服务器是否正确响应 现在我有这样的代码并卡住了 Mock ApiManager api
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 何时使用模拟框架?

    因此 我正在使用模拟框架 Moq 进行单元测试 并且想知道何时应该使用模拟框架 以下两个测试之间的优点 缺点是什么 public class Tests Fact public void TestWithMock Arrange var r
  • 工作流程系统中的单元/自动化测试

    您是否对像 K2 这样的复杂工作流程系统进行自动化测试 我们正在构建一个在 Sharepoint 2007 和 K2 之间进行广泛集成的系统 我什至无法想象从哪里开始自动化测试 因为工作流程涉及多个用户与 Sharepoint K2 工作流
  • 如何从CDN注入外部JS到Jest单元测试?

    我有 npm 和 webpack 的反应应用程序 我正在尝试向其添加单元测试 我使用的是包含在我的index html 中的CDN 的jQuery 而不是使用节点模块 我在组件中使用 jQueryTest1我向其中添加了单元测试用例 现在
  • 如果“testthat”测试在“R”中失败,则打印自定义诊断信息

    I use a testthat单元测试来检查是否data frame函数返回的结果与我期望它返回的结果相同 如果测试失败 testthat打印一些诊断信息 例如 MyFunction df orig is not identical to
  • JUnit 崩溃说方法应该是静态的,然后崩溃说它不应该?

    我正在尝试在 JUnit 中进行一个简单的示例测试 测试两件事 然后进行拆卸 import org junit public class TestFoobar Test public void testOneThing Code that
  • 如何对需要其他模块的 Node.js 模块进行单元测试以及如何模拟全局 require 函数?

    这是一个简单的例子 说明了我的问题的症结 var innerLib require path to innerLib function underTest return innerLib doComplexStuff module expo
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca

随机推荐