Search code examples
c#unit-testingtypemock

TypeMock - faking Console.Error.WriteLine()


I'm trying to fake console output logging with TypeMock:

[Test]
public void Log_Error_LogsToStdErr()
{
    var logger = SetupFakeLogger();

    logger.Log( "text to log", true );

    Isolate.Verify.WasCalledWithAnyArguments( () => logger.LogToFile( "" ) );
    Isolate.Verify.WasCalledWithAnyArguments( () => Console.Error.WriteLine( "" ) );
}

private static WrapperLogger SetupFakeLogger()
{
    Isolate.Fake.StaticMethods( typeof(Console), Members.ReturnRecursiveFakes );

    Isolate.WhenCalled( () => Console.Error.WriteLine( "" ) ).IgnoreCall();    

    return Isolate.Fake.Instance<WrapperLogger>( Members.CallOriginal, ConstructorWillBe.Called, "dir", "file.log" );
}

However I'm getting the following exception on my second assert (call to Isolate.Verify for Console.Error.WriteLine):

TypeMock Verification: Method System.Environment.NewLine was expected but was not called

Is this some sort of a bug, or am I doing it incorrectly?


Solution

  • disclaimer i work at Typemock.

    We don't support faking Console, please see our supported fakeable mscorlib types.

    You can use TextWriter instead of Console and it will work.

    See example:

     [TestMethod]
            public void Log_Error_LogsToStdErr()
            {
                var logger = SetupFakeLogger_Works();
    
                logger.Log("text to log", true);
    
                Isolate.Verify.WasCalledWithAnyArguments(() => logger.LogToFile(""));
                //Isolate.Verify.WasCalledWithAnyArguments(() => Console.Error.WriteLine(""));
            }
    
            private static WrapperLogger SetupFakeLogger_Works()
            {
                var textWriter = Isolate.Fake.Instance<TextWriter>();
                Console.SetOut(textWriter);
    
                return Isolate.Fake.Instance<WrapperLogger>(Members.CallOriginal, ConstructorWillBe.Called, "dir", "file.log");
            }