With Visual Studio keep changing the way you create unit tests I thought I’d document down how to test a private method the easy way.
Here is a simple HomeController and we want to test that the GetPageSize method return 20 in a unit test.
public class HomeController : Controller
{
public ActionResult Index()
{
var pageSize = GetPageSize();
return View(pageSize);
}
private int GetPageSize()
{
return 20;
}
}
As GetPageSize is a private method we’ll need to use the PrivateObject class to return the methods result, this is quite easy, from the Unit Test project make sure you have a reference to your MVC project and then reference the HomeController and invoke the method you need the result back from:
[TestMethod]
public void CheckPageSizeIs20()
{
PrivateObject privateObject = new PrivateObject(typeof(HomeController));
int pageSize;
pageSize = (int)privateObject.Invoke("GetPageSize");
Assert.AreEqual(20, pageSize);
}
If you need to pass in parameters to the private method then you can pass in an anonymous type
var actual = (IEnumerable<ActivityData>)privateObject.Invoke("GetAllUnassignedJobs", new object[] { filterData, uniqueJobs });
Reference: How to test a class member that is not public
Thanks to Karthik for googleing the answer
Just to note that if your containing class i.e. HomeController does not have a parameterless constructor, you will need to call the PrivateObject constructor overload that takes an object.