gpt4 book ai didi

unit-testing - 在 dart 中 stub 类的任何实例

转载 作者:行者123 更新时间:2023-12-03 03:26:45 25 4
gpt4 key购买 nike

使用 ruby​​ on rails 开发允许执行以下操作:

File.any_instance.expects(:delete)

这是在方法调用中测试副作用的好方法。

如何在 Dart 中做等价?

例如,如果您有 dart :
class Storage {
// the function to test
void deleteFile(String path) {
var fileToDelete = new File(path);
if (await fileToDelete.exists()) {
await fileToDelete.delete();
}
}
}
...
test("#deleteFile delete the file exists", () {
storage = new Storage();
// something equivalent to "File.any_instance.expects(:delete).once"
storage.deleteFile("/existing.txt")
});

test("#deleteFile does not try to delete the file when it does not exists", () {
storage = new Storage();
// something equivalent to "File.any_instance.expects(:delete).never"
storage.deleteFile("/not_existing.txt")
});

您将如何编写检测 File 的实例?是否已使用正确的参数调用?

正如这里所解释的,存在一些可以测试的模式: https://github.com/mockito/mockito/wiki/Mocking-Object-Creation

但是,这两种模式需要修改类以使其更可测试,方法是隔离 File在他自己的方法中创建对象,然后在实例化 Storage 时 stub 该方法或使用工厂来推断模拟。类(class)。

我想找到一种方法来做到这一点,而不必修改类以使其更易于测试,就像在 ruby​​ 中一样。

这对于检查方法执行期间是否生成了一些日志也非常有用。

最佳答案

没有通用的方法来拦截 Dart 中现有对象上的静态方法调用(包括构造函数)或实例成员。

您可以知道何时调用某个方法的唯一方法是,您是否可以在将对象引用传递给调用者之前包装调用该方法的对象。因为 Dart 允许实现任何类接口(interface),所以你可以包装任何你知道的对象,只要你能在对象的创建者和用户之间(如果你是创建者,你可以创建一个 mock 而不是曾经有一个真实的对象)。
这种方法仍然不适用于静态方法。

也就是说,您需要一些抽象层,您可以在其中替换代码而不是默认行为。

您当前问题的表述方式,无法解决。您不能更改 File 创建的对象构造函数,并且您无法更改其 delete 时发生的情况方法被调用。没有允许这样做的钩子(Hook)。
您需要重写 Storage类以某种方式引入允许您在类和 File 之间获取的抽象。对象,可能会采用 File createFile(String path)它使用的函数而不是 new File .

关于unit-testing - 在 dart 中 stub 类的任何实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49960202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com