Цепочка нескольких вызовов с одинаковыми аргументами для получения разных результатов - PullRequest
0 голосов
/ 22 декабря 2018

Я нахожусь в процессе написания Flutter приложения с обширным охватом модульных тестов.
Я использую Mockito , чтобы высмеивать мои классы.
Исходя из Java (Android) мир, в котором я могу использовать Mockito для объединения вызовов, чтобы возвращать различные значения при последующих вызовах.
Я ожидал бы, что это сработает.

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

void main() {
  test("some string test", () {
    StringProvider strProvider = MockStringProvider();
    when(strProvider.randomStr()).thenReturn("hello");
    when(strProvider.randomStr()).thenReturn("world");

    expect(strProvider.randomStr(), "hello");
    expect(strProvider.randomStr(), "world");
  });
}

class StringProvider {
  String randomStr() => "real implementation";
}

class MockStringProvider extends Mock implements StringProvider {}

Однако выдает:

Expected: 'hello'
Actual:   'world'
  Which: is different.

Единственный способ работы, который я нашел, - это отслеживать себя.

void main() {
  test("some string test", () {
    StringProvider strProvider = MockStringProvider();

    var invocations = 0;
    when(strProvider.randomStr()).thenAnswer((_) {
      var a = '';
      if (invocations == 0) {
        a = 'hello';
      } else {
        a = 'world';
      }
      invocations++;
      return a;
    });

    expect(strProvider.randomStr(), "hello");
    expect(strProvider.randomStr(), "world");
  });
}

00: 01 +1: все тесты пройдены!

Есть ли лучший способ?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Используйте список и верните ответы с removeAt:

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

void main() {
  test("some string test", () {
    StringProvider strProvider = MockStringProvider();
    var answers = ["hello", "world"];

    when(strProvider.randomStr()).thenAnswer((_) => answers.removeAt(0));

    expect(strProvider.randomStr(), "hello");
    expect(strProvider.randomStr(), "world");
  });
}

class StringProvider {
  String randomStr() => "real implementation";
}

class MockStringProvider extends Mock implements StringProvider {}
0 голосов
/ 22 декабря 2018

Вы не обязаны звонить when в начале теста:

StringProvider strProvider = MockStringProvider();
when(strProvider.randomStr()).thenReturn("hello");
expect(strProvider.randomStr(), "hello");

when(strProvider.randomStr()).thenReturn("world");
expect(strProvider.randomStr(), "world");

Мокито дартс ведет себя иначе.Последующие вызовы переопределяют значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...