unit-testing - 在 Raku 中进行单元测试时如何模拟类方法

标签 unit-testing methods mocking raku

假设我有这样的类(class):

class MyClass {
    method data-is-valid {
        return self!get-data ~~ m{^From};
    }

    method !get-data {
        return 'From Internet';
    }
}
在哪里 !get-data方法从 Internet 获取一些数据。
是否可以模拟该方法,使其返回我自己的硬编码数据,以便我可以在不连接到 Internet 的情况下测试模块?
理想情况下,解决方案不应以任何方式修改类的定义。
注意:一个 similar question存在关于模块的单元测试子程序。

最佳答案

我将首先重构以将获取逻辑拉出到不同的对象,并制作 MyClass依赖它:

class Downloader {
    method get-data {
        return 'From Internet';
    }
}

class MyClass {
    has Downloader $.downloader .= new;

    method data-is-valid {
        return $!downloader.get-data ~~ m{^From};
    }
}
这是一个依赖倒置的例子,它是一种使代码可测试的有用技术(并且也倾向于使其更容易以其他方式发展)。
通过此更改,现在可以使用 Test::Mock模拟模块Downloader :
use Test;
use Test::Mock;

subtest 'Is valid when contains From' => {
    my $downloader = mocked Downloader, returning => {
        get-data => 'From: blah'
    };
    my $test = MyClass.new(:$downloader);
    ok $test.data-is-valid;
    check-mock $downloader,
        *.called('get-data', :1times);
}

subtest 'Is not valid when response does not contain From' => {
    my $downloader = mocked Downloader, returning => {
        get-data => 'To: blah'
    };
    my $test = MyClass.new(:$downloader);
    nok $test.data-is-valid;
    check-mock $downloader,
        *.called('get-data', :1times);
}

关于unit-testing - 在 Raku 中进行单元测试时如何模拟类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63042080/

相关文章:

unit-testing - 单元测试使用Jest和React测试库对外部Click外部组件进行测试

scala - 在本地机器上进行 Spark 测试

android - 如何在 android profiler 中搜索某个方法?

java - 如何在 Mockito 中 stub 一个直到运行时才知道名称的方法?

unit-testing - 模拟对象与测试数据库

c# - 在 UnitTest Mock-DbContext 上使用

ios - 从命令行为 iOS 应用程序运行单独的 XCTest(UI、单元)测试用例

reactjs - 使用 React 测试库/Jest 模拟 axios 帖子

objective-c - iOS 初学者 : UIAlertView Window with 3 Buttons > Check what button was pressed

java - 如何修复 boolean 方法中的返回错误