diff --git a/scipost_django/news/factories.py b/scipost_django/news/factories.py
index 6a9a1b6b8b9be8f7aacae2445ae8bf12f51b2bf1..6b2f5a21117019bc17415260738d796a4a509272 100644
--- a/scipost_django/news/factories.py
+++ b/scipost_django/news/factories.py
@@ -4,7 +4,29 @@ __license__ = "AGPL v3"
 
 import factory
 
-from .models import NewsItem
+from .models import NewsItem, NewsLetter
+
+
+class NewsLetterFactory(factory.django.DjangoModelFactory):
+    class Meta:
+        model = NewsLetter
+
+    date = factory.Faker("date_this_year")
+    intro = factory.Faker("paragraph", nb_sentences=2)
+    closing = factory.Faker("paragraph", nb_sentences=2)
+    published = True
+
+    # Create NewsItems for this NewsLetter linking them through NewsLetterNewsItemsTable
+    @factory.post_generation
+    def news_items(self, create, extracted, **kwargs):
+        if not create:
+            return
+
+        if extracted:
+            for news_item in extracted:
+                self.news_items.add(news_item)
+
+        self.news_items = NewsItemFactory.create_batch(3)
 
 
 class NewsItemFactory(factory.django.DjangoModelFactory):
diff --git a/scipost_django/news/tests/test_factories.py b/scipost_django/news/tests/test_factories.py
new file mode 100644
index 0000000000000000000000000000000000000000..f175a91fb966dec8271dab0e02b7be901ba83422
--- /dev/null
+++ b/scipost_django/news/tests/test_factories.py
@@ -0,0 +1,18 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from django.test import TestCase
+from ..factories import NewsItemFactory, NewsLetterFactory
+
+
+class TestNewsLetterFactory(TestCase):
+    def test_can_create_news_letters(self):
+        news_letter = NewsLetterFactory()
+        self.assertIsNotNone(news_letter)
+
+
+class TestNewsItemFactory(TestCase):
+    def test_can_create_news_items(self):
+        news_item = NewsItemFactory()
+        self.assertIsNotNone(news_item)