I have read that the changes to the code base should not change the unit tests.
Let me say this straight: this makes no sense.
I don't have that book at hand, and you did not tell us which section lead you to this interpretation, still I am convinced you must have misread something. Unit tests (as well as any other kind of test) will not be required to change when an implementation of a certain (externally visible) behaviour changes, as long as the desired behaviour itself stays the same. But when the implementation changes up to the point where the desired behaviour changes, then the tests for this behaviour obviously have to change as well.
For example, different implementations of ConsoleGreetingService.ShowGreeting
like
Console.WriteLine("Hello!");
or
const string greetings = "Hello!";
Console.WriteLine(greetings);
or
Console.WriteLine(GetHelloInCertainLanguage(new CultureInfo("en")) + "!");
can all be subject to the same, unchanged test which verifies the expected string is printed to the console.
Replacing a console output by some GUI output, however, is a change which obviously changes the externally visible behaviour, hence there is no reason to assume tests don't have to be changed.
Side note: how to implement a test which verifies that a certain message box with a certain text will be shown, and if it is justified call such a test a "unit test" is a separate topic which I don't discuss here.