Alyssa
Alyssa

Reputation: 885

Flutter test - verifying assets exist

I have a flutter app which contains a large list of quotes, each with an associated audio file.

I've written a simple test that verifies all the specified audio files are where they're supposed to be, in case of typos etc:

test('specified audio file should exist for all quotes', () {
    ALL_QUOTES.forEach((quote) {
      final expectedPath = 'assets/${quote.filename}.wav';
      final exists = new File(expectedPath).existsSync();
      expect(exists, isTrue, reason: '$expectedPath does not exist');
    });
  });

This passes fine in IntelliJ, however running from the command line using flutter test it fails on the first thing it looks for.

Is there a way of doing this which will work regardless of how it's run? Why does it pass one way but not the other?

Upvotes: 1

Views: 1497

Answers (1)

Alyssa
Alyssa

Reputation: 885

Ok so I got to the bottom of this, and it is something you can do in a unit test.

To diagnose, I added the line print(Directory.current); to the test. Running in IntelliJ, I get /home/project_name. From the command line, it's /home/project_name/test. So just a simple file path thing to resolve.

Edited to include Ovidiu's simpler logic for getting the right asset path

void main() {
  test('specified audio file should exist for all quotes', () {
    ALL_QUOTES.forEach((quote) {
      final expectedPath = 'assets/${quote.filename}.wav';
      final exists = _getProjectFile(expectedPath).existsSync();
      expect(exists, isTrue, reason: '$expectedPath does not exist');
    });
  });
}

File _getProjectFile(String path) {
  final String assetFolderPath = Platform.environment['UNIT_TEST_ASSETS'];
  return File('$assetFolderPath/$path');
}

Upvotes: 1

Related Questions