diff --git a/pyfakefs/fake_filesystem.py b/pyfakefs/fake_filesystem.py
index c9367248..a6230bd1 100644
--- a/pyfakefs/fake_filesystem.py
+++ b/pyfakefs/fake_filesystem.py
@@ -4549,7 +4549,6 @@ def truncate_wrapper(*args, **kwargs):
             if self._append:
                 self._io.seek(self._read_seek, self._read_whence)
             size = io_attr(*args, **kwargs)
-            self.flush()
             if not self.is_stream:
                 self.file_object.SetSize(size)
                 buffer_size = len(self._io.getvalue())
@@ -4559,6 +4558,7 @@ def truncate_wrapper(*args, **kwargs):
                     self.file_object.SetContents(
                         self._io.getvalue(), self._encoding)
                     self._flush_pos = size
+            self.flush()
             if not IS_PY2:
                 return size
 
diff --git a/pyfakefs/tests/fake_open_test.py b/pyfakefs/tests/fake_open_test.py
index 99741f9e..b67fb0a9 100644
--- a/pyfakefs/tests/fake_open_test.py
+++ b/pyfakefs/tests/fake_open_test.py
@@ -769,6 +769,17 @@ def test_update_other_instances_of_same_file_on_flush(self):
         f1.flush()
         self.assertEqual(4, self.os.path.getsize(file_path))
 
+    def test_getsize_after_truncate(self):
+        # Regression test for #412
+        file_path = self.make_path('foo')
+        with self.open(file_path, 'a') as f:
+            f.write('a')
+            f.seek(0)
+            f.truncate()
+            f.write('b')
+            f.truncate()
+            self.assertEqual(1, self.os.path.getsize(file_path))
+
     def test_that_read_over_end_does_not_reset_position(self):
         # Regression test for #286
         file_path = self.make_path('baz')