gpt4 book ai didi

flutter - 用于 dart/flutter 测试的覆盖/模拟库函数

转载 作者:行者123 更新时间:2023-12-05 04:45:49 24 4
gpt4 key购买 nike

我想知道是否有一种方法可以覆盖库函数,这样它们就不会触发或只是返回其他内容。

import 'package:foo_package/exposing_foo_function.dart';

class TestableClass {
bool bar() {
return foo(); //foo is from the imported library
}
}

测试:

void main() {

test('TestableClass.bar() when foo_package.foo() returns false', () {
TestableClass testableClass = TestableClass();

// Something to make foo_package.foo() return false.

expect(testableClass.bar(), isFalse);

});
}

最佳答案

mockito 这样的东西通过创建实现模拟类接口(interface)的模拟类来工作。但是,这不适用于全局和静态函数。

您可以做的是避免直接调用这些全局/静态函数,而是通过额外的间接级别调用它们。例如:

import 'package:foo_package/exposing_foo_function.dart' as foo_package;

class TestableClass {
final bool Function() foo;

TestableClass({this.foo = foo_package.foo});

bool bar() {
return foo();
}
}

然后进行测试:

void main() {
test('TestableClass.bar() when foo_package.foo() returns false', () {
bool fakeFoo() => false;
TestableClass testableClass = TestableClass(foo: fakeFoo);
expect(testableClass.bar(), isFalse);
});
}

类似的方法是将全局/静态函数包装为类的实例方法:

import 'package:foo_package/exposing_foo_function.dart' as foo_package;

class FooManager {
bool foo() => foo_package.foo();
}

var fooManager = FooManager();

class TestableClass {
bool bar() {
return fooManager.foo();
}
}

然后您的测试可以像任何其他类一样模拟 FooManager 并将 fooManager 设置为模拟版本。 (或者,如果您更喜欢依赖倒置而不是全局变量,请将您模拟的 FooManager 版本作为构造参数传递给 TestableClass。)

当然,以上所有内容仅对通过包装器的您自己的调用有帮助。如果您无法控制的代码调用这些函数,那将无济于事。在这种情况下,您最好的做法可能是向函数的作者提示缺乏可测试性。

关于flutter - 用于 dart/flutter 测试的覆盖/模拟库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69042013/

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