Unity EditorWindowでUndoしたいとき

なんか色々罠を踏んだのでメモ。
(コメントついてる箇所は、罠踏んだ部分。)

using UnityEngine;
using UnityEditor;
using System;
 
public class TestWindow : EditorWindow {
    // Serializableの物(public or SerializeField)がUndo対象.
    [SerializeField] string testText;
 
    [MenuItem("Window/TestWindow")]
    static void Open()
    {
        var window = (TestWindow)EditorWindow.GetWindow(typeof(TestWindow));
        window.Show();
    }
 
    void OnGUI()
    {
        EditorGUI.BeginChangeCheck();
 
        // ここで直接代入してはいけない.
        var tempTestText = EditorGUILayout.TextField("", testText);
 
        if(EditorGUI.EndChangeCheck())
        {
            // Undoで戻る先を保存する.
            Undo.RecordObject(this, "test undo");
 
            // そのあと、変更を適用
            testText = tempTestText;
        }
    }
}