Unit Testing error "Object reference not set to an instance of an object."

15,723

Solution 1

After stubbing the method use Return to indicate what should it return, for example:

_mockRepository
  .Stub(x => x.GetModuleKindPropertyNames(Arg<string>.Is.Anything))
  .Return(Enumerable.Empty<string>().AsQueryable());

Also, change this line:

_controller.GetModulePropertyName(Arg<string>.Is.Anything);

to this:

_controller.GetModulePropertyName(string.Empty);

As the exception explains - Arg is only to be used in mock definitions.

Solution 2

You don't have a return on your stub.

_mockRepository.Stub(x => x.GetModuleKindPropertyNames(Arg<string>.Is.Anything));

without that return, this line will be running a lambda against a null reference

 IList<Property> model = temp.Select(item => new Property {Name = item}).ToList();

so:

    _mockRepository.Stub(x => x.GetModuleKindPropertyNames(Arg<string>.Is.Anything)).Return(new Module[]{}); // set some return data here
Share:
15,723
Cybercop
Author by

Cybercop

Master student of Web Science. Block chain and Machine Learning enthusiast

Updated on June 12, 2022

Comments

  • Cybercop
    Cybercop almost 2 years

    In my controller I want to test if the controller is calling the repository method. Here is the method in controller

    [HttpGet]
    public ActionResult GetModulePropertyName(string moduleTypeValue)
    {
      var temp = _modulerepository.GetModuleKindPropertyNames(moduleTypeValue);
    
      IList<Property> model = temp
         .Select(item => new Property {Name = item})
         .ToList();
    
      return PartialView("GetModulePropertyName",model);
    }
    

    And here is the test method

    [TestMethod]
    public void GetModulePropertyName_Action_Calls_GetModuleKindPropertyNames()
    {
      _mockRepository.Stub(x => x.GetModuleKindPropertyNames(Arg<string>.Is.Anything));
    
      _controller.GetModulePropertyName(Arg<string>.Is.Anything);
    
      _mockRepository.AssertWasCalled(x=>x.GetModuleKindPropertyNames(Arg<string>.Is.Anything));
    }
    

    It throws an error saying

    Test method AdminPortal.Tests.ModuleControllerTests.GetModulePropertyName_Action_Calls_GetModuleKindPropertyNames threw exception: 
    System.NullReferenceException: Object reference not set to an instance of an object.
        at System.Linq.Queryable.Select(IQueryable`1 source, Expression`1 selector)
       at AdminPortal.Areas.Hardware.Controllers.ModuleController.GetModulePropertyName(String moduleTypeValue) in ModuleController.cs: line 83
       at AdminPortal.Tests.ModuleControllerTests.GetModulePropertyName_Action_Calls_GetModuleKindPropertyNames() in ModuleControllerTests.cs: line 213
    

    I'm using RhinoMock as mocking tool. Can someone help with what mistake i'm making?