diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 3657d75..ff9945b 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -28,7 +28,7 @@
     return re.sub("\[\d+ refs\]\r?\n?$", "", stderr.decode()).encode()
     #return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
 
-class BaseTestCase(unittest.TestCase):
+class ProcessTestCase(unittest.TestCase):
     def setUp(self):
         # Try to minimize the number of children we have so this test
         # doesn't crash on some buildbots (Alphas in particular).
@@ -41,15 +41,14 @@
         if hasattr(support, "reap_children"):
             support.reap_children()
 
-    def mkstemp(self, *args, **kwargs):
+    def mkstemp(self):
         """wrapper for mkstemp, calling mktemp if mkstemp is not available"""
         if hasattr(tempfile, "mkstemp"):
-            return tempfile.mkstemp(*args, **kwargs)
+            return tempfile.mkstemp()
         else:
-            fname = tempfile.mktemp(*args, **kwargs)
+            fname = tempfile.mktemp()
             return os.open(fname, os.O_RDWR|os.O_CREAT), fname
 
-class ProcessTestCase(BaseTestCase):
     #
     # Generic tests
     #
@@ -864,7 +863,6 @@
             p.terminate()
             self.assertNotEqual(p.wait(), 0)
 
-
 class CommandTests(unittest.TestCase):
 # The module says:
 #   "NB This only works (and is only relevant) for UNIX."
@@ -895,50 +893,6 @@
 
 unit_tests = [ProcessTestCase, CommandTests]
 
-if mswindows:
-    class CommandsWithSpaces (BaseTestCase):
-
-        def setUp(self):
-            super().setUp()
-            f, fname = self.mkstemp(".py", "te st")
-            self.fname = fname.lower ()
-            os.write(f, b"import sys;"
-                        b"sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))"
-            )
-            os.close(f)
-
-        def tearDown(self):
-            os.remove(self.fname)
-            super().tearDown()
-
-        def with_spaces(self, *args, **kwargs):
-            kwargs['stdout'] = subprocess.PIPE
-            p = subprocess.Popen(*args, **kwargs)
-            self.assertEqual(
-              p.stdout.read ().decode("mbcs"),
-              "2 [%r, 'ab cd']" % self.fname
-            )
-
-        def test_shell_string_with_spaces(self):
-            # call() function with string argument with spaces on Windows
-            self.with_spaces('"%s" "%s"' % (self.fname, "ab cd"), shell=1)
-
-        def test_shell_sequence_with_spaces(self):
-            # call() function with sequence argument with spaces on Windows
-            self.with_spaces([self.fname, "ab cd"], shell=1)
-
-        def test_noshell_string_with_spaces(self):
-            # call() function with string argument with spaces on Windows
-            self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
-                                 "ab cd"))
-
-        def test_noshell_sequence_with_spaces(self):
-            # call() function with sequence argument with spaces on Windows
-            self.with_spaces([sys.executable, self.fname, "ab cd"])
-
-    unit_tests.append(CommandsWithSpaces)
-
-
 if getattr(subprocess, '_has_poll', False):
     class ProcessTestCaseNoPoll(ProcessTestCase):
         def setUp(self):
