Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Moq: Mock SetUp method only returns null during test

I just added dependency inject into my application, and would like to run mock test on my methods to ensure they are working properly.

I have a domain class Person with the following properties:

public class Person : DomainBase
{
   public string FirstName { get; set; }
    public string LastName { get; set; }
    public char Gender { get; set; }
    public DateTime DOB {get; set; }
}

I have a partial manager class that is shared with other domain type mangers:

public partial class Manager : IManager1
{
    private IHiveTiesContext _ctx; 
    public Manager(IHiveTiesContext context)
    {
        _ctx = context;
    }
}

The interface IManager1 was extracted from my PersonManager class and contains all need methods.

My PersonManager CreatePerson() method is being called and tested:

public partial class Manager : IManager1
{
    public Person CreatePerson(string fn, string ln, DateTime dob, char gender, Guid RId)
    {
       var _person =_ctx.People.Add(new Person
       {  
          FirstName = fn,
          LastName = ln,
          DOB = dob,
          Gender = gender,
          RowId = RId});

          _ctx.SaveChanges();
          return _person;
        }
    }  
} 

My context follows and once again I extracted an interface IHiveTiesContext from it.

public class HiveTiesContext : DbContext, IHiveTiesContext
{
    public HiveTiesContext() :  base("hiveties")
    {
        Database.SetInitializer<HiveTiesContext>(null);
    }

    public virtual IDbSet<Person> People { get; set; }
}

Finally I am trying to test CreatePerson like this:

public class PersonManagerMockTest
{
    private static Guid personGuid;

    [ClassInitialize]
    public static void Init(TestContext test)
    {
        personGuid = Guid.NewGuid();
    }

    [TestMethod]
    public void AddNewPerson()
    {
        //Arrange
        var mockDbSet = new Mock<DbSet<Person>>();

        var mockContext = new Mock<IHiveTiesContext>();
        mockContext.Setup(x => x.People)
            .Returns(mockDbSet.Object);

        var manager = new Manager(mockContext.Object);

        //Assert
        var _person = manager.CreatePerson("Winston", "Gabriel", DateTime.Now, 'M', personGuid);

        if(_person == null)
        {
            throw new Exception("NOT WORKING MAN!!!!");
        }

        var personid = mockContext.Object.People.Single(x => x.RowId == personGuid).Id;

        //Act
        mockDbSet.Verify(x => x.Add(It.IsAny<Person>()));
        mockContext.Verify(x => x.SaveChanges());
    }
}

My problem is that my Person object is never created, that is, it always returns a null value and the exception is always thrown. I believe I am telling it to return a Person entity, but I am not sure where I am going wrong. This is my first time using Moq and running Mock Unit Tests.

I appreciate any suggestions. Thank you.

like image 309
Aaron LWG Avatar asked Jan 14 '16 02:01

Aaron LWG


1 Answers

You didn't set any behavior on the Add method of mockDbSet.

Add:(This line initialize the method to return the given person)

mockDbSet.Setup(x => x.Add(It.IsAny<Person>()))
         .Returns <Person>(p => p);

Between the mocks:

var mockDbSet = new Mock<DbSet<Person>>();
mockDbSet.Setup(x => x.Add(It.IsAny<Person>()))
         .Returns<Person>(p => p);

var mockContext = new Mock<IHiveTiesContext>();
mockContext.Setup(x => x.People)
           .Returns(mockDbSet.Object);
...
like image 98
Old Fox Avatar answered Sep 27 '22 21:09

Old Fox