Fixed test by implementing FindMethodByName().
diff --git a/python/descriptor_pool.c b/python/descriptor_pool.c
index 1b0d325..144f3ee 100644
--- a/python/descriptor_pool.c
+++ b/python/descriptor_pool.c
@@ -484,13 +484,43 @@
   if (!name) return NULL;
 
   const upb_ServiceDef* s = upb_DefPool_FindServiceByName(self->symtab, name);
+  if (s == NULL && self->db) {
+    if (!PyUpb_DescriptorPool_TryLoadSymbol(self, arg)) return NULL;
+    s = upb_DefPool_FindServiceByName(self->symtab, name);
+  }
   if (s == NULL) {
-    return PyErr_Format(PyExc_KeyError, "Couldn't find enum %.200s", name);
+    return PyErr_Format(PyExc_KeyError, "Couldn't find service %.200s", name);
   }
 
   return PyUpb_ServiceDescriptor_Get(s);
 }
 
+static PyObject* PyUpb_DescriptorPool_FindMethodByName(PyObject* _self,
+                                                       PyObject* arg) {
+  PyUpb_DescriptorPool* self = (PyUpb_DescriptorPool*)_self;
+
+  const char* name = PyUpb_GetStrData(arg);
+  if (!name) return NULL;
+  size_t parent_size;
+  const char* child = PyUpb_DescriptorPool_SplitSymbolName(name, &parent_size);
+
+  if (!child) goto err;
+  const upb_ServiceDef* parent =
+      upb_DefPool_FindServiceByNameWithSize(self->symtab, name, parent_size);
+  if (parent == NULL && self->db) {
+    if (!PyUpb_DescriptorPool_TryLoadSymbol(self, arg)) return NULL;
+    parent = upb_DefPool_FindServiceByNameWithSize(self->symtab, name,
+                                                    parent_size);
+  }
+  if (!parent) goto err;
+  const upb_MethodDef* m = upb_ServiceDef_FindMethodByName(parent, child);
+  if (!m) goto err;
+  return PyUpb_MethodDescriptor_Get(m);
+
+err:
+  return PyErr_Format(PyExc_KeyError, "Couldn't find method %.200s", name);
+}
+
 static PyObject* PyUpb_DescriptorPool_FindFileContainingSymbol(PyObject* _self,
                                                                PyObject* arg) {
   PyUpb_DescriptorPool* self = (PyUpb_DescriptorPool*)_self;
@@ -498,10 +528,11 @@
   const char* name = PyUpb_GetStrData(arg);
   if (!name) return NULL;
 
-  const upb_FileDef* f = upb_DefPool_FindFileByNameforsym(self->symtab, name);
+  const upb_FileDef* f =
+      upb_DefPool_FindFileContainingSymbol(self->symtab, name);
   if (f == NULL && self->db) {
     if (!PyUpb_DescriptorPool_TryLoadSymbol(self, arg)) return NULL;
-    f = upb_DefPool_FindFileByNameforsym(self->symtab, name);
+    f = upb_DefPool_FindFileContainingSymbol(self->symtab, name);
   }
   if (f == NULL) {
     return PyErr_Format(PyExc_KeyError, "Couldn't find symbol %.200s", name);
@@ -562,8 +593,8 @@
      "Searches for oneof descriptor by full name."},
     {"FindServiceByName", PyUpb_DescriptorPool_FindServiceByName, METH_O,
      "Searches for service descriptor by full name."},
-    //{ "Find, PyUpb_DescriptorPool_Find, METH_O,
-    //  "Searches for method descriptor by full name." },
+    {"FindMethodByName", PyUpb_DescriptorPool_FindMethodByName, METH_O,
+     "Searches for method descriptor by full name."},
     {"FindFileContainingSymbol", PyUpb_DescriptorPool_FindFileContainingSymbol,
      METH_O, "Gets the FileDescriptor containing the specified symbol."},
     {"FindExtensionByNumber", PyUpb_DescriptorPool_FindExtensionByNumber,