Dart中的单元测试文本输出(stdout.write / print)

时间:2018-07-22 12:39:24

标签: unit-testing dart

我正在寻找Dart编程语言中的一种方法来重定向 从stdout输出到一个“东西”,我可以调用.toString()并获取 在标准输出上打印为String的任何内容。这对单元测试很有用。

当前,我将stdout包装在Display类中,并存储一个调用的文本,并验证stdout的写入是否为 用过的。另请参阅下面的我的旁注:如何用Java完成。

import 'dart:io';

import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

class Display {
  IOSink output;
  String lastTextPrinted;

  Display(IOSink output) {
    this.output = output;
  }

  void myPrint(String text) {
    lastTextPrinted = text;
    output.write(text);
  }
}

main() {
  test('prints hello world', () {
    Display display = new Display(stdout);
    display.myPrint("Hello world!");
    expect("Hello world!", display.lastTextPrinted);
  });

  test('myPrint calls ioSinks write', () {
    MockIOSink ioSink = new MockIOSink();
    Display display = Display(ioSink);
    display.myPrint("Hello world!");

    verify(ioSink.write("Hello world!"));
  });
}

class MockIOSink extends Mock implements IOSink {}

旁注:在带有JUnit 4的Java中,我使用了类似的东西:

System.out有一个PrintStream,我可以为其分配自己的Stream,例如ByteArrayOutPutStream。 后者具有.toString方法,我可以调用该方法来验证其内容。

@Test
public void testMyMessageToDisplay() throws Exception
{
 ByteArrayOutputStream canvas = new ByteArrayOutputStream();
 System.setOut(new PrintStream(canvas);

 new Display().displayMyMessage("Hello world!");

 Assert.assertEquals("Hello World!", canvas.toString("UTF-8"));
}

public static class Display {
    public void displayMyMessage(String myMessage) {
        System.out.println(myMessage);
    }
}

1 个答案:

答案 0 :(得分:2)

看看https://pub.dartlang.org/packages/test_process-它提供了许多不错的方法来验证流程的输出

请参阅自述文件中的示例:

<input name="myName" ng-model="myName" required>
<span ng-show="myForm.myName.$touched && myForm.myName.$invalid">please fill out this field</span>