我正在为 Flutter 方法编写一个单元测试,该方法调用异步方法然后返回,让异步按时完成。我的测试“在完成后”失败了。
这是我的测试:
test('mark as viewed', () {
final a = Asset();
expect(a.viewed, false);
a.markAsViewed();
expect(a.viewed, true);
});
Run Code Online (Sandbox Code Playgroud)
这是它正在测试的方法:
void markAsViewed() {
viewed = true;
Repository.get().saveToStorage();
}
Run Code Online (Sandbox Code Playgroud)
该saveToStorage()方法是一个异步方法,我只是让它在后台执行。
我该如何进行这项工作?测试失败告诉我Make sure to use [expectAsync] or the [completes] matcher when testing async code.,但我不知道该怎么做。谁能解释一下或者指出我正确的文档吗?我找不到任何关于如何处理这些异步的信息,当它不是Future被返回时,而是被单独完成。
需要明确的是 - 这个单元测试并不是要测试它是否保存到存储中,只是对设置为 的基本viewed测试true。
已编辑
错误如下:
package:flutter/src/services/platform_channel.dart 319:7 MethodChannel.invokeMethod
===== asynchronous gap ===========================
dart:async _asyncErrorWrapperHelper
package:exec_pointers/asset_details.dart Repository.saveToStorage
package:exec_pointers/asset_details.dart 64:22 Asset.markAsViewed
test/asset_details_test.dart 57:9 main.<fn>.<fn>
This test failed after it …Run Code Online (Sandbox Code Playgroud) 我正在使用iOS将文件从iOS上传到S3,AWSS3TransferUtility并尝试在文件上设置自定义元数据。我正在使用元数据键X-Amz-Meta-uploadParameters和值“ Test”对其进行测试。
它正确显示在请求标头中:
... &X-Amz-Expires=2999&X-Amz-Meta-uploadParameters=Test&X-Amz-Security-Token= ...
Run Code Online (Sandbox Code Playgroud)
显然正在发生某些事情,因为密钥uploadparameters在S3控制台中的确出现在对象的属性中,但是具有空白值。要仔细检查我s3api --head-object在CLI中使用的内容,返回的内容如下:
{
"AcceptRanges": "bytes",
"LastModified": "Thu, 16 Mar 2017 08:04:41 GMT",
"ContentLength": 1331730,
"ETag": "\"[hex data here]\"",
"ContentType": "image/jpeg",
"Metadata": {
"uploadparameters": ""
}
}
Run Code Online (Sandbox Code Playgroud)
这是我如何设置的值AWSS3TransferUtilityUploadExpression:
let params = [
"X-Amz-Meta-uploadParameters": "Test"
]
//Copy the custom Meta information into the expression
for (key, value) in params {
expression.setValue(value, forRequestParameter: key)
}
Run Code Online (Sandbox Code Playgroud)
经历了各种各样的变化之后,我仍然离设置实际的元数据还很近。我在这里想念什么?
在我的 Flutter 应用程序中,我有一个 ListView,其中包含几个定制的有状态小部件(EditableAreaCard 类型,基于来自定制区域对象的数据)。EditableAreaCard 可以是可编辑的,如果是这样,卡片上有一个编辑按钮,可以将其带入编辑模式 - 然后出现取消和保存按钮。
用户可以向列表中添加一个新项目 - 因此会创建一个 Area 对象,并设置一个标志,以便 ListView.builder 在可编辑模式下将此新 Area 对象添加到列表的顶部。
但是,当发生这种情况时,新对象会添加到列表顶部,但背景颜色错误且未处于编辑模式。观察这张卡片被编辑和关闭时的行为,很明显 ListView 并没有完全刷新它的所有子项,而是重用它们 - 索引 0 处的新项与之前的索引 0,现在已下推到索引 1。
这是代码 - 删除了卡片的内容,因为我认为它不相关......但如果需要,会发布它。
class AreasScreen extends StatefulWidget {
static const id = '/areas';
static _AreasScreenState of(BuildContext context) =>
context.ancestorStateOfType(const TypeMatcher<_AreasScreenState>());
@override
_AreasScreenState createState() => _AreasScreenState();
}
class _AreasScreenState extends State<AreasScreen> {
Areas _alist = AreaRepo.get();
Area _new_area = null;
bool _is_adding_area = false;
void cancel_add_area() {
setState(() {
_new_area = null;
_is_adding_area = false; …Run Code Online (Sandbox Code Playgroud)