--- a
+++ b/tests/unit/docs/test_common.py
@@ -0,0 +1,68 @@
+import pytest
+
+from ehrql.docs.common import get_docstring, get_function_body
+
+
+class ExampleClass:
+    # Comments above
+    @staticmethod
+    def example_method_with_docstring(
+        arg1: int,
+        arg2: str,
+    ) -> str:  # pragma: no cover
+        """
+        Docstring goes here
+        """
+        # Make it bigger
+        arg1 = arg1 + 100
+        # Make it smaller
+        arg1 = arg1 // 2
+        return arg2 + str(arg1)
+
+    def example_method_no_docstring(self):  # pragma: no cover
+        # Return the thing
+        return "foo"
+
+
+EXPECTED_WITH_DOCSTRING = """\
+# Make it bigger
+arg1 = arg1 + 100
+# Make it smaller
+arg1 = arg1 // 2
+return arg2 + str(arg1)
+"""
+
+
+EXPECTED_NO_DOCSTRING = """\
+# Return the thing
+return "foo"
+"""
+
+
+@pytest.mark.parametrize(
+    "method,expected",
+    [
+        (ExampleClass.example_method_with_docstring, EXPECTED_WITH_DOCSTRING),
+        (ExampleClass.example_method_no_docstring, EXPECTED_NO_DOCSTRING),
+    ],
+)
+def test_get_function_body(method, expected):
+    assert get_function_body(method) == expected
+
+
+def test_get_docstring():
+    assert (
+        get_docstring(ExampleClass.example_method_with_docstring)
+        == "Docstring goes here"
+    )
+
+
+def test_get_docstring_with_default():
+    assert (
+        get_docstring(ExampleClass.example_method_no_docstring, default="foo") == "foo"
+    )
+
+
+def test_get_docstring_with_error():
+    with pytest.raises(ValueError, match="No docstring defined for public object"):
+        get_docstring(ExampleClass.example_method_no_docstring)