diff --git a/tests/constraints/models.py b/tests/constraints/models.py
index f8a4ebe675..faef2163bf 100644
--- a/tests/constraints/models.py
+++ b/tests/constraints/models.py
@@ -1,4 +1,5 @@
 from django.db import models
+from django.db.models.functions import Lower
 
 
 class Product(models.Model):
@@ -107,6 +108,19 @@ class UniqueConstraintInclude(models.Model):
         ]
 
 
+class UniqueConstraintExpression(models.Model):
+    name = models.CharField(max_length=15)
+
+    class Meta:
+        required_db_features = {
+            'supports_table_check_constraints',
+            'supports_covering_indexes',
+        }
+        constraints = [
+            models.UniqueConstraint(Lower('name'), name='name_lower_unique'),
+        ]
+
+
 class AbstractModel(models.Model):
     age = models.IntegerField()
 
diff --git a/tests/constraints/tests.py b/tests/constraints/tests.py
index 3d59d07b24..7e52cb3c24 100644
--- a/tests/constraints/tests.py
+++ b/tests/constraints/tests.py
@@ -10,8 +10,8 @@ from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
 
 from .models import (
     ChildModel, Product, UniqueConstraintConditionProduct,
-    UniqueConstraintDeferrable, UniqueConstraintInclude,
-    UniqueConstraintProduct,
+    UniqueConstraintDeferrable, UniqueConstraintExpression,
+    UniqueConstraintInclude, UniqueConstraintProduct,
 )
 
 
@@ -561,6 +561,17 @@ class UniqueConstraintTests(TestCase):
                 opclasses=['jsonb_path_ops'],
             )
 
+    @skipUnlessDBFeature(
+        'supports_table_check_constraints',
+        'supports_covering_indexes',
+    )
+    def test_expressions_validate_unique(self):
+        UniqueConstraintExpression.objects.create(name='Blah')
+        msg = 'Unique constraint expression with this ? already exists.'
+        instance = UniqueConstraintExpression(name='BlAh')
+        with self.assertRaisesMessage(ValidationError, msg):
+            instance.validate_unique()
+
     def test_requires_name(self):
         msg = 'A unique constraint must be named.'
         with self.assertRaisesMessage(ValueError, msg):
