问题就出在这段代码中:
void main() {
late List<int> data;
setUp(() async {
data = [11, 22, 33];
});
int counter = 0;
for (final d in data) { // error
test('data', () {
expect(d, data[counter++]);
});
}
}
字符串
错误:
Local 'data' has not been initialized.
型
- 如何指定
setUp
函数应该在数据被使用之前被调用?*
我尝试在group
中 Package test
-同样的错误。
3条答案
按热度按时间x6yk4ghg1#
setUp
和test
接受 callbacks 作为参数,这些参数将在以后某个未指定的时间执行,但具有一定的相对顺序。具体来说,setUp
注册了一个回调,该回调将在每个test
回调执行之前执行。以下是事件的顺序:
setUp
注册其回调。1.执行
for
-循环。test
在循环的每次迭代中被调用,注册一个回调。for
-循环退出。1.执行测试,每个测试包括:
1.执行步骤1中的
setUp
回调。1.执行步骤3中的
test
回调。for
-loop不存在于test
回调函数中;它在setUp
注册其回调函数后立即执行。没有办法在for
-loop之前自动执行setUp
回调函数。如果你真的想这样做,你可以显式地将回调函数设置为一个显式调用的命名函数:字符串
然而,
setUp
应该在执行每个测试之前用于重置共享状态,但是您的测试不会改变任何共享状态。因此,在您的情况下,您甚至不需要setUp
:型
bsxbgnwa2#
@jamesdlin的回答帮了大忙,这要感谢他。下面的代码演示了这种行为:
字符串
将打印:
型
如果您不打算使用
setUpCustom
中的参数,这可能是完全可行的。n9vozmp43#
经过两天的努力,我找到了一个最佳解决方案,它允许您使用收集集并在测试时准确地调用
setUp
和tearDown
。看,这里有一个简单的 Package :
字符串
根据需要添加所需的参数。也可以是异步的,工作正常。
现在我们可以执行以下代码(稍微扩展以展示功能):
型
控制台的输出如下:
型
如果我们使用这个answer中的
setUpAction
,我们会遇到两个问题:setUpAction
将发生两次,我们将测试不完全是什么意图添加
isTest
注解,这样idea就可以看到来自meta
包的测试(如果需要,还有一个isTestGroup
注解):用于注解运行单个测试的测试框架函数。工具(如IDE)可以在文件结构视图中显示此类函数的调用,以帮助用户在大型测试文件中导航。函数的第一个参数必须是测试的描述。