diff --git a/opentech/apply/funds/tests/factories/blocks.py b/opentech/apply/funds/tests/factories/blocks.py
index 4d5863edce829d2b843f68cf2c600f724eaabfbc..218067c050e5a0a908669bf4184c84adcfcdab62 100644
--- a/opentech/apply/funds/tests/factories/blocks.py
+++ b/opentech/apply/funds/tests/factories/blocks.py
@@ -1,6 +1,9 @@
 import json
 import uuid
 
+from django.core.files.uploadedfile import InMemoryUploadedFile
+
+import factory
 from wagtail.wagtailcore.blocks import CharBlock
 import wagtail_factories
 
@@ -17,19 +20,33 @@ class CharBlockFactory(wagtail_factories.blocks.BlockFactory):
 
 
 class FormFieldBlockFactory(wagtail_factories.StructBlockFactory):
+    default_value = factory.Faker('word')
+
     class Meta:
         model = stream_blocks.FormFieldBlock
 
+    @classmethod
+    def make_answer(cls, params=dict()):
+        return cls.default_value.generate(params)
+
 
 class CharFieldBlockFactory(FormFieldBlockFactory):
+    default_value = factory.Faker('sentence')
+
     class Meta:
         model = stream_blocks.CharFieldBlock
 
 
 class NumberFieldBlockFactory(FormFieldBlockFactory):
+    default_value = 100
+
     class Meta:
         model = stream_blocks.NumberFieldBlock
 
+    @classmethod
+    def make_answer(cls, params=dict()):
+        return cls.default_value
+
 
 class RadioFieldBlockFactory(FormFieldBlockFactory):
     choices = wagtail_factories.ListBlockFactory(CharBlockFactory)
@@ -38,6 +55,30 @@ class RadioFieldBlockFactory(FormFieldBlockFactory):
         model = stream_blocks.RadioButtonsFieldBlock
 
 
+class UploadableMediaFactory(FormFieldBlockFactory):
+    default_value = factory.django.FileField
+
+    @classmethod
+    def make_answer(cls, params=dict()):
+        file_name, file = cls.default_value()._make_content(params)
+        return InMemoryUploadedFile(file, 'file', file_name, None, file.tell(), None)
+
+
+class ImageFieldBlockFactory(UploadableMediaFactory):
+    class Meta:
+        model = stream_blocks.ImageFieldBlock
+
+
+class FileFieldBlockFactory(UploadableMediaFactory):
+    class Meta:
+        model = stream_blocks.FileFieldBlock
+
+
+class MultiFileFieldBlockFactory(UploadableMediaFactory):
+    class Meta:
+        model = stream_blocks.MultiFileFieldBlock
+
+
 class TitleBlockFactory(FormFieldBlockFactory):
     class Meta:
         model = blocks.TitleBlock
@@ -78,4 +119,7 @@ CustomFormFieldsFactory = StreamFieldUUIDFactory({
     'number': NumberFieldBlockFactory,
     'radios': RadioFieldBlockFactory,
     'rich_text': RichTextFieldBlockFactory,
+    'image': ImageFieldBlockFactory,
+    'file': FileFieldBlockFactory,
+    'multi_file': MultiFileFieldBlockFactory,
 })
diff --git a/opentech/apply/funds/tests/factories/models.py b/opentech/apply/funds/tests/factories/models.py
index 5fada182149ec8ec79849618c28f25efe78bc8ae..8cd5754e3d059bbc1251d8c400cf1a0854321c65 100644
--- a/opentech/apply/funds/tests/factories/models.py
+++ b/opentech/apply/funds/tests/factories/models.py
@@ -5,6 +5,8 @@ import json
 import factory
 import wagtail_factories
 
+from wagtail.wagtailcore.blocks import StreamBlock
+
 from opentech.apply.funds.models import (
     AbstractRelatedForm,
     ApplicationSubmission,
@@ -132,14 +134,16 @@ class LabFormFactory(AbstractRelatedFormFactory):
 
 class FormDataFactory(factory.Factory):
     def _create(self, *args, form_fields='{}', **kwargs):
-        form_fields = json.loads(form_fields)
+        form_fields = ApplicationSubmission.form_fields.field.to_python(form_fields)
         form_data = {}
         for field in form_fields:
             try:
-                answer = kwargs[field['type']]
+                answer = kwargs[field.block_type]
             except KeyError:
-                answer = 'the answer'
-            form_data[field['id']] = answer
+                # Get the factory and delegate to the block to make an answer
+                factory = blocks.CustomFormFieldsFactory.factories[field.block_type]
+                answer = factory.make_answer()
+            form_data[field.id] = answer
 
         return form_data