Unit testing 颤振环境下的单元测试

Unit testing 颤振环境下的单元测试,unit-testing,dart,flutter,Unit Testing,Dart,Flutter,我在Dart类中有一个方法,它接受BuildContext参数,如下所示: class MyClass { <return_type> myMethodName(BuildContext context, ...) { ... doSomething return something; } } 当然,它不会工作,因为方法myMethodName需要一个参数BuildContext类型。这个值在整个应用程序中都是可用的,但

我在Dart类中有一个方法,它接受
BuildContext
参数,如下所示:

class MyClass {

  <return_type> myMethodName(BuildContext context, ...) {
        ...
        doSomething
        return something;
    }
}
当然,它不会工作,因为方法
myMethodName
需要一个参数
BuildContext
类型。这个值在整个应用程序中都是可用的,但不确定在我的单元测试中从何处获得

一种方法是结合使用:


实际上,您可以模拟
BuildContext
,这样测试将无头运行。我认为这更好,但可能不是您正在寻找的解决方案

BuildContext
是一个抽象类,因此无法实例化。任何抽象类都可以通过创建该类的实现来模拟。如果我以您为例,那么代码将如下所示:

class MockBuildContext extends Mock implements BuildContext {}

void main() {
   MyClass sut;
   MockBuildContext _mockContext;

   setUp(() {
     sut = MyClass();
     _mockContext = MockBuildContext();
   });

   test('me testing', () {

   var actual = sut.myMethodName(_mockContext, ...);        

   expect(actual, something);
  });
}

以下是在测试用例中检索BuildContext实例的简单方法:

testWidgets('showDialog', (WidgetTester tester) async {
  await tester.pumpWidget(MaterialApp(home: Material(child: Container())));
  final BuildContext context = tester.element(find.byType(Container));

  final dialog = showDialog(
    context: context,
    builder: (context) => AlertDialog(
      content: Text('shown by showDialog'),
    ),
  );

  // apply your tests to dialog or its contents here.
});
这是受
showDialog()
函数颤振测试用例的启发


整个“应用程序”由
MaterialApp
框架中的
容器
小部件组成。通过查找与
容器相关的
元素
实例
来检索
BuildContext
实例。我测试了它,但得到了一个异常:
一个构建函数返回null…
。似乎需要返回任何类型的小部件。我刚刚添加了
returncontainer()
,似乎可以做到这一点way@Nicolas哎呀!对不起,我忘了。我已经改正了。
class MockBuildContext extends Mock implements BuildContext {}

void main() {
   MyClass sut;
   MockBuildContext _mockContext;

   setUp(() {
     sut = MyClass();
     _mockContext = MockBuildContext();
   });

   test('me testing', () {

   var actual = sut.myMethodName(_mockContext, ...);        

   expect(actual, something);
  });
}
testWidgets('showDialog', (WidgetTester tester) async {
  await tester.pumpWidget(MaterialApp(home: Material(child: Container())));
  final BuildContext context = tester.element(find.byType(Container));

  final dialog = showDialog(
    context: context,
    builder: (context) => AlertDialog(
      content: Text('shown by showDialog'),
    ),
  );

  // apply your tests to dialog or its contents here.
});