Moq:Mock SetUp方法仅在测试期间返回null

Aar*_*LWG 3 c# unit-testing entity-framework moq mocking

我刚刚将依赖注入添加到我的应用程序中,并希望对我的方法运行模拟测试以确保它们正常工作.

我有一个Person具有以下属性的域类:

public class Person : DomainBase
{
   public string FirstName { get; set; }
    public string LastName { get; set; }
    public char Gender { get; set; }
    public DateTime DOB {get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个manager与其他域类型管理员共享的部分类:

public partial class Manager : IManager1
{
    private IHiveTiesContext _ctx; 
    public Manager(IHiveTiesContext context)
    {
        _ctx = context;
    }
}
Run Code Online (Sandbox Code Playgroud)

界面IManager1是从我的PersonManager类中提取的,包含所有需要的方法.

我的PersonManager CreatePerson()方法正在被调用和测试:

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;
        }
    }  
} 
Run Code Online (Sandbox Code Playgroud)

接下来是我的上下文,我再一次从中提取了一个接口IHiveTiesContext.

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

    public virtual IDbSet<Person> People { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

最后我试着CreatePerson像这样测试:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我的Person对象永远不会被创建,也就是说,它总是返回一个null值,并且总是抛出异常.我相信我告诉它要归还一个Person实体,但我不确定我哪里出错了.这是我第一次使用Moq和运行Mock Unit Tests.

我很感激任何建议.谢谢.

Old*_*Fox 8

您没有在Add方法上设置任何行为mockDbSet.

添加:(此行初始化方法以返回给定的人)

mockDbSet.Setup(x => x.Add(It.IsAny<Person>()))
         .Returns <Person>(p => p);
Run Code Online (Sandbox Code Playgroud)

嘲笑之间:

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);
...
Run Code Online (Sandbox Code Playgroud)