-
Notifications
You must be signed in to change notification settings - Fork 164
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Creating a Mock stops debugger from working in flutter application #285
Comments
That's a bizarre bug. Can you show me the exact code that creates this bug? Can you show me the output of flutter doctor? |
Here's a sample I put together. All I have to do in the test file at the bottom is remove the here's import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() {
runApp(
MyApp(),
);
}
abstract class HomeRouteFactory {
Route call();
}
class MyApp extends StatelessWidget {
final HomeRouteFactory myAppHomePageRouteFactory;
const MyApp({
Key key,
this.myAppHomePageRouteFactory,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
onGenerateRoute: (settings) {
return MaterialPageRoute(
builder: (context) {
return NotesListPage(
notesValueListenable: ValueNotifier<List<NoteListModel>>([]),
);
},
);
},
);
}
}
abstract class NoteListModel {
String get title;
String get id;
}
class NotesListPage extends StatelessWidget {
final ValueListenable<List<NoteListModel>> notesValueListenable;
const NotesListPage({
this.notesValueListenable,
});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Notes'),
),
body: ValueListenableBuilder<List<NoteListModel>>(
valueListenable:
notesValueListenable ?? ValueNotifier<List<NoteListModel>>([]),
builder: (context, notes, child) {
return Visibility(
visible: notes != null,
replacement: Center(child: CircularProgressIndicator()),
child: ListView.separated(
itemBuilder: (context, index) {
return ListTile(
title: Text(notes[index]?.title ?? ''),
);
},
separatorBuilder: (context, index) => Divider(),
itemCount: notesValueListenable?.value?.length ?? 0,
),
);
},
),
);
}
} and import 'package:flutter/material.dart';
import 'package:flutter_notes/main.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
class StubNoteListModel implements NoteListModel {
final String title;
final String id;
StubNoteListModel({this.title, this.id});
}
class MockNoteListModel extends Mock implements NoteListModel {}
void main() {
group('Note List Page', () {
testWidgets('it shows list of notes', (WidgetTester tester) async {
// GIVEN
final note1 = StubNoteListModel();
final note2 = StubNoteListModel();
final notesValuesNotifier = ValueNotifier<List<NoteListModel>>([
note1,
note2,
]);
// WHEN
await tester.pumpWidget(
MaterialApp(
home: NotesListPage(
notesValueListenable: notesValuesNotifier,
),
),
);
// THEN
expect(find.byType(ListTile), findsNWidgets(2));
});
});
}
name: flutter_notes
description: A new Flutter project.
# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.3
dev_dependencies:
flutter_test:
sdk: flutter
mockito: ^4.0.0
integration_test: ^0.9.1
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages |
Here's another quick piece of crazy info, if I change the mock to: class MockNoteListModel extends Mock implements ValueNotifier {} any internal class to dart/flutter sdk and it starts working again. |
also here is flutter doctor, almost forgot:
|
In a simple app, if you import mockito into a flutter application test and then create any mock class (don't even have to use it) using
extends Mock
the debugger will no longer stop at any breakpoints in non-test code. This has caused us a number of headaches. If there is anything I can do to help, please let me know.The text was updated successfully, but these errors were encountered: