当我正常运行我的应用程序时,我执行 cubit.getWeather('London')并发出weatherLoading状态,然后weatherLoaded状态正确发出。
但是,当我对 cubit 运行 test 来 test 时cubit.getWeather('London'),不会发出 WeatherLoading 状态 - 它会直接跳转到 WeatherLoaded 状态。
为什么会发生这种情况?
状态:
@freezed
abstract class WeatherState with _$WeatherState {
factory WeatherState.weatherInitial() = WeatherInitial;
factory WeatherState.weatherLoading() = WeatherLoading;
factory WeatherState.weatherLoaded(Weather weather) = WeatherLoaded;
factory WeatherState.weatherError(String message) = WeatherError;
}
Run Code Online (Sandbox Code Playgroud)
肘:
class WeatherCubit extends Cubit<WeatherState> {
final WeatherRepository _weatherRepository;
static Weather weather;
WeatherCubit(this._weatherRepository) : super(WeatherState.weatherInitial());
Future<void> getWeather(String cityName) async {
emit(WeatherState.weatherLoading());
try {
final weather = await _weatherRepository.fetchWeather(cityName);
emit(WeatherState.weatherLoaded(weather));
} on NetworkException {
emit(WeatherState.weatherError("Network …Run Code Online (Sandbox Code Playgroud) 我有一些单元测试和一些仅与测试相关的类,例如我的模型的工厂,mockito 的一些扩展等等......
问题是,当我尝试从测试中导入这些文件时,我可以使用相对路径导入它们,假设我有这个实用程序:
test/src/test_utils/factories.darttest/src/test_utils/mocks.darttest/src/test_utils/mockito_extensions.dart但是当我尝试从测试中导入它们时,它找不到它们
import 'package:myapp/test_utils/mocks.dart';
Run Code Online (Sandbox Code Playgroud)
或者:
import 'package:myapp/src/test_utils/mocks.dart';
Run Code Online (Sandbox Code Playgroud)
导入它们的唯一方法是通过相对路径,例如:
import '../../test_utils/mocks.dart';
Run Code Online (Sandbox Code Playgroud)
我很想了解这里发生了什么,为什么我的测试无法在导入中找到测试 utils 类,以及执行此操作的最佳方法是什么。
我正在尝试使用 GraphQL 为 flutter 应用程序创建小部件测试。我想做的是测试应用程序的行为,该行为取决于用户操作的 GraphQL 突变的结果。
这是该应用程序的一个非常简单的示例:
class FirstScreen extends StatelessWidget {
@override
Widget return Container(
child: Mutation(
options: myMutationOptions,
onCompleted: (dynamic result) {
final bool myBool = result['bool'] as bool;
if (myBool) {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => SecondScreen()));
} else {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => ThirdScreen()));
}
},
builder: (RunMutation runMutation, QueryResult queryResult) {
return FlatButton(
child: Text('Button'),
onPressed: () async {
await runMutation(myParameters).networkResult;
},
);
},
),
);
}
Run Code Online (Sandbox Code Playgroud)
我想做的是模拟突变的结果,因此在我的小部件测试中,我可以测试按钮是否重定向到SecondScreen或ThirdScreen取决于结果myBool。
我怎样才能做到这一点 ?
我想在 Azure Devops Pipelines 上使用 flutter 驱动程序运行自动化 UI 测试,并且我正在使用Alois Daniel 的 Flutter Tasks。azure flutter 任务插件目前不支持 flutter 驱动程序。我们正在寻找在运行 flutter 驱动程序测试时启动 Android 和 iOS 模拟器的任务。我们正在 azure devops pipeline yml 文件中运行 macos-latest 的 vm-image。
在我的 Flutter 应用程序中,我有一个名为 的文件web.dart,其中有一个webSaveAs函数可以将文件保存到 web 中的本地计算机上。
@JS()\nlibrary main;\n\nimport \'package:js/js.dart\';\nimport \'package:universal_html/html.dart\';\n\n/// Annotate `webSaveAs` to invoke JavaScript `window.webSaveAs`\n@JS(\'webSaveAs\')\nexternal void webSaveAs(Blob blob, String fileName);\nRun Code Online (Sandbox Code Playgroud)\n但是,当我运行任何导入flutter test我使用过webSaveAs功能的小部件的测试(使用命令)时,出现以下错误:
./../../../development/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3-nullsafety.3/lib/js.dart:8:1: Error: Not found: \'dart:js\'\nexport \'dart:js\' show allowInterop, allowInteropCaptureThis;\n^\nRun Code Online (Sandbox Code Playgroud)\n我正在使用js: ^0.6.2https://pub.dev/packages/js ,这是命令的结果flutter doctor。
\xe2\x95\xb0>>> flutter doctor\nDoctor summary (to see all details, run flutter doctor -v):\n[\xe2\x9c\x93] Flutter (Channel beta, 1.25.0-8.3.pre, on macOS 11.2.1 20D74 darwin-x64, locale en-SG)\n[\xe2\x9c\x93] Android toolchain - …Run Code Online (Sandbox Code Playgroud) 所以我的代码的问题是,一旦我按下提交按钮,我的屏幕就会变黑,然后我无法保存下一个响应。我希望一旦提交我的表单就应该重置以供重复使用,并且应该准备好接受用户的下一个响应,是的,黑屏也应该消失。
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MaterialApp(home: MyApp()));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
TextEditingController problemBox = TextEditingController();
final db = FirebaseFirestore.instance;
List _listItem = ["Category 1", "Category 2", "Category 3", "Category 4"];
List _listItem1 = [
"Sub Category 1",
"Sub Category 2",
"Sub Category 3",
"Sub Category 4"
];
List _listItem2 = ["CRIS", "ADMINISTRATION", "ZONE", "DEPARTMENT"];
String dropdownValue; …Run Code Online (Sandbox Code Playgroud) 首先,我确实检查了这一点,但没有结果。\n如何从测试中访问 Flutter 环境变量?
\nimport \'package:flutter/widgets.dart\';\nimport \'package:flutter_test/flutter_test.dart\';\n\nimport \'package:integration_test/integration_test.dart\';\nimport \'package:main.dart\' as app;\n\nimport \'package:mockito/annotations.dart\';\nimport \'package:firebase_auth/firebase_auth.dart\' as firebaseauth;\n\nimport \'package:flutter_dotenv/flutter_dotenv.dart\';\n\nimport \'basic_app_test.mocks.dart\';\n\n\n@GenerateMocks([firebaseauth.FirebaseAuth])\nvoid main() async {\n TestWidgetsFlutterBinding.ensureInitialized();\n await DotEnv().load(fileName: ".env");\n\n group(\'Login Page Tests\', () {\n testWidgets(\'Empty Login Box\', (WidgetTester tester) async {\n app.main();\n\n await tester.pumpAndSettle(Duration(seconds: 3));\n\n expect(find.byKey(Key(\'loginButton\')), findsOneWidget);\n\n final Finder loginButton = find.byKey(Key(\'loginButton\'));\n\n await tester.tap(loginButton);\n\n await tester.pumpAndSettle();\n\n expect(\n find.text(\n \'Something went wrong. Please check your email and password and try again.\'),\n findsOneWidget);\n });\n\n testWidgets(\'Email Login - Proper Credentials\',\n (WidgetTester tester) async {\n\n app.main();\n\n // Wait …Run Code Online (Sandbox Code Playgroud) 每当我尝试使用命令测试我的应用程序时,flutter run它都非常缓慢且缓慢,并且我无法确定我的应用程序在发布模式下的性能如何。然而,为了构建 Android 应用程序,release mode我们需要为应用程序创建一个密钥,它不会显示大部分日志文件和打印。
所以问题是,有没有办法以发布模式格式运行应用程序,但具有调试功能?
我已经在 setUp() 方法中分配了变量,但仍然抛出错误。如果我将 MockBuildContext 设置为可为空,则测试运行成功,但这不是正确的方法。有什么我错过的或建议更好的方法来解决这个问题。
看我的代码:
void main(){
MockBuildContext mockBuildContext;
setUpGetIt(testing: true);
setUp((){
mockBuildContext = MockBuildContext();
});
group("banks test", (){
test("Calling fetchAllBanks returns instance of BanksModel list", () async {
banksBloc.init(mockBuildContext);
await banksBloc.fetchAllBanks();
banksBloc.allBanks?.listen((event) {
expect(event, isInstanceOf<List<BanksModel>>);
});
});
});
}
Run Code Online (Sandbox Code Playgroud)
我的错误日志:
C:\Src\flutter\bin\flutter.bat --no-color test --machine --start-paused test\unit_test\system\bank_configuration\banks_test.dart
Testing started at 18:52 ...
test/unit_test/system/bank_configuration/banks_test.dart:24:22: Error: Non-nullable variable 'mockBuildContext' must be assigned before it can be used.
banksBloc.init(mockBuildContext);
^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud) 我尝试向用户显示一个对话框,以防发布更新版本。我使用了 new_version 包版本:0.3.0。但我收到警告。
void _checkVersion()async{
final newVersion=NewVersion(
final status=await newVersion.getVersionStatus();
if(status?.canUpdate==true){
newVersion.showUpdateDialog(
context: context,
versionStatus: status!,
allowDismissal: false,
dialogTitle: "UPDATE",
dialogText: "Please update the app from ${status.localVersion} to ${status.storeVersion}",
);}}
Run Code Online (Sandbox Code Playgroud)
flutter-test ×10
flutter ×9
dart ×6
unit-testing ×2
azure-devops ×1
bloc ×1
flutter-web ×1
forms ×1
graphql ×1
mockito ×1
testing ×1