Another way in Moq to call protected member is the following template:
-
In your class, with protected member mark your function as virtual.
For example:public class ClassProtected { public string CallingFunction(Customer customer) { var firstName = ProtectedFunction(customer.FirstName); var lastName = ProtectedFunction(customer.LastName); return string.Format("{0}, {1}", lastName, firstName); } protected virtual string ProtectedFunction(string value) { return value.Replace("SAP", string.Empty); } }
Then in your unit test add reference to
using Moq.Protected;
and in your unit test you can write the following:
[TestFixture]
public class TestClassProttected
{
[Test]
public void all_bad_words_should_be_scrubbed()
{
//Arrange
var mockCustomerNameFormatter = new Mock<ClassProtected>();
mockCustomerNameFormatter.Protected()
.Setup<string>("ProtectedFunction", ItExpr.IsAny<string>())
.Returns("here can be any value")
.Verifiable(); // you should call this function in any case. Without calling next Verify will not give you any benefit at all
//Act
mockCustomerNameFormatter.Object.CallingFunction(new Customer());
//Assert
mockCustomerNameFormatter.Verify();
}
}
Take note of ItExpr. It should be used instead of It. Another gotcha awaits you at Verifiable. I don’t know why, but without calling to Verifiable Verify will not be called.