I recently discovered a rather annoying limitation in Moq: you cannot setup expectations on the ToString method. For a good discussion of the issue, check out Sean’s post. His solution was to add ToString explicitly to the interface you are mocking, but I don’t want to dirty up my interfaces unnecessarily. Fortunately, Moq does allow you to create mocks that implement multiple interfaces, so you could move the ToString method to a dummy interface, and use Mock<T>.As to setup expectations on the dummy interface. That’s the approach I took, but I wrapped it up in a nice extension method:
public static class MoqExtensions
{
public static ISetup<IToStringable, string> SetupToString<TMock>(this Mock<TMock> mock) where TMock : class
{
return mock.As<IToStringable>().Setup(m => m.ToString());
}
//Our dummy nested interface.
public interface IToStringable
{
/// <summary>
/// ToString.
/// </summary>
/// <returns></returns>
string ToString();
}
}
Now I can setup expectations on ToString by simply using:
[Test]
public void ExpectationOnToStringIsMet()
{
var widget = new Mock<IWidget>();
widget.SetupToString().Returns("My value").Verifiable();
Assert.That(widget.Object.ToString(), Is.EqualTo("My value"));
widget.Verify();
}
Tags: