Почему мой mockito не прошел тест, если фактический результат совпадает с ожидаемым? трепетать

Я использую Mockito в приложении flutter и хочу добавить несколько тестовых примеров:

этот прогон не удался, а фактический результат такой же, как и ожидаемый, вот мой тестовый файл:

      @GenerateMocks([ResumeParserDataSource])
void main() {
  late MockResumeParserDataSource resumeParserDataSource;
  late ResumeParserController resumeParserController;
  late ResumeParserRepo resumeParserRepo;

  setUp(() async {
    Get.reset();
    resumeParserDataSource = MockResumeParserDataSource();
    resumeParserRepo =
        Get.put(ResumeParserRepo(dataSource: resumeParserDataSource));
    resumeParserController = Get.put(ResumeParserController());
  });

  group('Upload resume that uploaded into API:\n', () {
    test(
        '~succeed state~ api get response and parsed it into model JSON "ParsedDetailsResume"',
        () async {
      when(resumeParserRepo
              .getResumeDetailsAfterParsing(ResumeParserTestUtil.fileName))
          .thenAnswer((_) async => Right(
              ResumeParserTestUtil.parsedResumeDetailsFunction(
                  ResumeParserTestUtil.parsedResumeDetailsModel1)));
      await resumeParserController
          .parseResumeToAPI(ResumeParserTestUtil.fileName);
      await waitForAPIResponse();
      expect(
          resumeParserController.parsedResume.value,
          some(ResumeParserTestUtil.parsedResumeDetailsFunction(
              ResumeParserTestUtil.parsedResumeDetailsModel1)));
      expect(resumeParserController.error.value, none());
    });
  });
}

вот мой ResumeParserController:

      
class ResumeParserController extends GetxController {
  static ResumeParserController get to => Get.find();
  final resumeParserRepo = ResumeParserRepo.to;
  Rx<Option<ParsedResumeDetails>> parsedResume =
      Rx<Option<ParsedResumeDetails>>(none());

  Future<Either<DioError, ParsedResumeDetails>> parseResumeToAPI(
      String fileName,
      {User? user}) async {
    var result = await resumeParserRepo.getResumeDetailsAfterParsing(
      fileName,
      user: user,
    );
    return result.fold(
      (l) => Left(l),
      (newParsedResume) async {
        error.value = none();
        parsedResume.value = some(newParsedResume);
        update();
        return Right(newParsedResume);
      },
    );
  }
}

и вот моя модель json в ResumeParserTestUtil:

      class ResumeParserTestUtil {

  static String fileName = "12989801ahsduiabsdui9123ajd.pdf";

  static ParsedResumeDetails parsedResumeDetailsFunction(
      Map<String, dynamic> response,
      {User? user}) {
    var userSkills = response['data']['userSkills'] == null
        ? [PublicUserSkill.empty()]
        : List.from(response['data']['userSkills'])
            .map((e) => PublicUserSkill.fromJson(e["skill"]))
            .toList();
    var userEducations = response['data']['educations'] == null
        ? [EducationParsed.empty()]
        : List.from(response['data']['educations'])
            .map((e) => EducationParsed.fromJson(e))
            .toList();

    var experiences = response['data']['experiences'] == null
        ? [ExperiencesParsed.empty()]
        : List.from(response['data']['experiences'])
            .map((e) => ExperiencesParsed.fromJson(e))
            .toList();
    return ParsedResumeDetails(
      user: user,
      userSkills:
          userSkills.map(mapPublicUserSkillToSkillWithUserSkill).toList(),
      userEducation: userEducations,
      userWorkExperience: experiences,
    );
  }

  static Map<String, dynamic> parsedResumeDetailsModel1 = {
    "data": {
      "experiences": [
        {
          "startDate": null,
          "endDate": null,
          "isPresent": false,
          "organization": "Unnamed company",
          "type": "WORK"
        }
      ],
      "userSkills": [
        {
          "skill": {
            "id": "7963a547-3980-47d6-8ffc-c9e311152d9b",
            "name": "Bachelors Degree > Bachelors Degree Economics",
            "popularity": "0",
            "flagRecount": false,
            "createdAt": null,
            "updatedAt": null,
          },
        },
        {
          "skill": {
            "id": "05516ee5-1706-4296-aaa3-f3386767dec6",
            "name":
                "Bachelors Degree > Bachelors Degree Information Engineering and Media",
            "popularity": "0",
            "flagRecount": false,
            "createdAt": null,
            "updatedAt": null,
          }
        },
        {
          "skill": {
            "id": "0baaa115-a770-42f5-ad54-291ffa42a11c",
            "name": "Bachelors Degree > Bachelors Degree Literature",
            "popularity": "0",
            "flagRecount": false,
            "createdAt": null,
            "updatedAt": null
          }
        },
        {
          "skill": {
            "id": "7a4ca05f-8d75-44c5-b012-5a0298160903",
            "name": "Bachelors Degree > Bachelors Degree Mathematics",
            "popularity": "0",
            "flagRecount": false,
            "createdAt": null,
            "updatedAt": null,
          },
        },
        {
          "skill": {
            "id": "b29215d5-c3cf-4b62-82df-2ee5db1c160c",
            "name": "Bachelors Degree > Bachelors Degree history",
            "popularity": "0",
            "flagRecount": false,
            "createdAt": null,
            "updatedAt": null
          }
        }
      ],
      "educations": [
        {
          "startDate": null,
          "endDate": null,
          "type": "EDUCATION",
          "isPresent": true,
          "study": {
            "id": "572502d1-fb5c-4876-8985-2c4278b98a8b",
            "name":
                "Information Engineering and Media, history, Economics, Literature, Mathematics",
            "createdAt": "",
            "updatedAt": ""
          },
          "school": {
            "id": "f54c85dd-f51e-4715-a393-dbcea6edbed7",
            "name": "Adamson University",
            "domain": "adamson.edu.ph",
            "website": "http://www.adamson.edu.ph/",
            "state": null,
            "type": null,
            "CountryCode": "PH",
            "createdAt": null,
            "updatedAt": null
          },
          "degree": {
            "id": "63dd0edf-9193-4ac0-b693-ae561873e4a3",
            "name": "Bachelor",
            "createdAt": "",
            "updatedAt": ""
          }
        },
        {
          "startDate": null,
          "endDate": null,
          "type": "EDUCATION",
          "isPresent": true,
          "school": {
            "id": "1dedeca8-154b-4e8f-a867-d359616d996c",
            "name": "Adipala Junior High School",
            "domain": null,
            "website": null,
            "state": null,
            "type": null,
            "CountryCode": null,
            "createdAt": "",
            "updatedAt": null
          }
        },
        {
          "startDate": null,
          "endDate": null,
          "type": "EDUCATION",
          "isPresent": true,
          "school": {
            "id": "38420130-dac4-4a3c-a1bc-cea4777054c1",
            "name": "Unnamed school",
            "domain": null,
            "website": null,
            "state": null,
            "type": null,
            "CountryCode": null,
            "createdAt": null,
            "updatedAt": null
          }
        }
      ]
    }
  };
}

и вот результат:

Expected: Some: <Some (ParsedResumeDetails([EducationParsed(true, null, null, null, EDUCATION), EducationParsed(true, null, null, null, EDUCATION), EducationParsed(true, null, null, null, EDUCATION)], [ExperiencesParsed(false, null, Безымянная компания, null, WORK)], [Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill)] >

Actual: Some: <Some (ParsedResumeDetails([EducationParsed(true, null, null, null, EDUCATION), EducationParsed(true, null, null, null, EDUCATION), EducationParsed(true, null, null, null, EDUCATION)], [ExperiencesParsed(false, null, Безымянная компания, null, WORK)], [Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill, Экземпляр SkillWithUserSkill)] >

пакет:test_api

✖ Загрузить резюме, загруженное в API:~ состояние успешно ~ API получить ответ и преобразовать его в модель JSON "ParsedDetailsResume"

Вышел (1)

Есть мысли по этому поводу? Спасибо!

1 ответ

Столкнулся с той же проблемой, пытаясь протестировать асинхронный вызов, где он не удался, потому что я установил ожидаемое значение, завернутое в Future.value()

Решение в этом случае состоит в следующем:

  1. сначала извлеките значение из асинхронного вызова с помощью await
  2. затем выполните проверку необработанного значения без какого-либо понятия Future<>

например:

      test('test SomeService()', () async {

  final actual = await someService.getSomeList();

  expect(actual, []);
});
Другие вопросы по тегам