假设我有这样的类(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/