diff --git a/hgitaly/testing/context.py b/hgitaly/testing/context.py
index 20ebc8401a38b0035d68f3fb53ce98dd4ea93dbe_aGdpdGFseS90ZXN0aW5nL2NvbnRleHQucHk=..b5c85c712b567a55ba08b592353910edbe23ecbb_aGdpdGFseS90ZXN0aW5nL2NvbnRleHQucHk= 100644
--- a/hgitaly/testing/context.py
+++ b/hgitaly/testing/context.py
@@ -51,3 +51,31 @@
     set_details = fake_impl
     set_trailing_metadata = fake_impl
     time_remaining = fake_impl
+
+
+class FakeContextAbort(RuntimeError):
+    pass
+
+
+class FakeContextAborter(FakeServicerContext):
+    """A fake context that is good enough to test various `abort()` cases.
+    """
+
+    _trailing_metadata = _code = _details = None
+
+    def set_trailing_metadata(self, metadata):
+        self._trailing_metadata = metadata
+
+    def trailing_metadata(self):
+        return self._trailing_metadata
+
+    def code(self):
+        return self._code
+
+    def details(self):
+        return self._details
+
+    def abort(self, code, details):
+        self._code = code
+        self._details = details
+        raise FakeContextAbort()
diff --git a/hgitaly/tests/test_errors.py b/hgitaly/tests/test_errors.py
index 20ebc8401a38b0035d68f3fb53ce98dd4ea93dbe_aGdpdGFseS90ZXN0cy90ZXN0X2Vycm9ycy5weQ==..b5c85c712b567a55ba08b592353910edbe23ecbb_aGdpdGFseS90ZXN0cy90ZXN0X2Vycm9ycy5weQ== 100644
--- a/hgitaly/tests/test_errors.py
+++ b/hgitaly/tests/test_errors.py
@@ -19,7 +19,9 @@
 from ..errors import (
     structured_abort
 )
-from ..testing.context import FakeServicerContext
+from ..testing.context import (
+    FakeContextAborter as FakeContext,
+)
 
 StatusCode = grpc.StatusCode
 
@@ -35,28 +37,6 @@
     assert re.search('https://.*/-/issues/1234567', exc.details()) is not None
 
 
-class FakeContext(FakeServicerContext):
-
-    _trailing_metadata = _code = _details = None
-
-    def set_trailing_metadata(self, metadata):
-        self._trailing_metadata = metadata
-
-    def trailing_metadata(self):
-        return self._trailing_metadata
-
-    def code(self):
-        return self._code
-
-    def details(self):
-        return self._details
-
-    def abort(self, code, details):
-        self._code = code
-        self._details = details
-        raise RuntimeError('abort-from-tests')
-
-
 def test_structured_abort():
     context = FakeContext()
 
diff --git a/hgitaly/tests/test_linguist.py b/hgitaly/tests/test_linguist.py
index 20ebc8401a38b0035d68f3fb53ce98dd4ea93dbe_aGdpdGFseS90ZXN0cy90ZXN0X2xpbmd1aXN0LnB5..b5c85c712b567a55ba08b592353910edbe23ecbb_aGdpdGFseS90ZXN0cy90ZXN0X2xpbmd1aXN0LnB5 100644
--- a/hgitaly/tests/test_linguist.py
+++ b/hgitaly/tests/test_linguist.py
@@ -10,33 +10,10 @@
 from ..linguist import (
     language_stats,
 )
-from ..testing.context import FakeServicerContext
-
-
-class FakeContextAbort(RuntimeError):
-    pass
-
-
-class FakeContext(FakeServicerContext):
-
-    _trailing_metadata = _code = _details = None
-
-    def set_trailing_metadata(self, metadata):
-        self._trailing_metadata = metadata
-
-    def trailing_metadata(self):
-        return self._trailing_metadata
-
-    def code(self):
-        return self._code
-
-    def details(self):
-        return self._details
-
-    def abort(self, code, details):
-        self._code = code
-        self._details = details
-        raise FakeContextAbort()
+from ..testing.context import (
+    FakeContextAborter as FakeContext,
+    FakeContextAbort,
+)
 
 
 def test_tokei_subprocesss_errors(tmpdir):