C# Moq:Mock安装方法在测试期间仅返回null

C# Moq:Mock安装方法在测试期间仅返回null,c#,entity-framework,unit-testing,mocking,moq,C#,Entity Framework,Unit Testing,Mocking,Moq,我刚刚将依赖注入添加到我的应用程序中,并希望对我的方法运行模拟测试,以确保它们正常工作 我有一个域类Person,具有以下属性: public class Person : DomainBase { public string FirstName { get; set; } public string LastName { get; set; } public char Gender { get; set; } public DateTime DOB {get; s

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

我有一个域类
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; }
}
我有一个与其他域类型管理器共享的部分
管理器
类:

public partial class Manager : IManager1
{
    private IHiveTiesContext _ctx; 
    public Manager(IHiveTiesContext context)
    {
        _ctx = context;
    }
}
接口
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;
        }
    }  
} 
接下来是我的上下文,我再次从中提取了一个接口
IHiveTiesContext

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

    public virtual IDbSet<Person> People { get; set; }
}
我的问题是从未创建我的
Person
对象,也就是说,它总是返回
null
值,并且总是抛出异常。我相信我是在告诉它返回一个
Person
实体,但我不确定我哪里出错了。这是我第一次使用
Moq
并运行
模拟单元测试


我感谢你的建议。谢谢。

我在iLive上下文中创建了一个新的签名/函数来保存Person对象。(现在取决于您如何实现接口)

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
名称空间采样管理器
{
公共类管理器:IManager
{
私人IHiveTiesContext_ctx;
公共经理(IHiveTiesContext)
{
_ctx=上下文;
}
公共人物CreatePerson(字符串fn、字符串ln、日期时间dob、字符性别、Guid RId)
{
var person=_ctx.Save(fn,ln);
返回人;
}
}
公共阶层人士
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符{get;set;}
公共日期时间DOB{get;set;}
公共Guid RowId{get;set;}
}
公共接口IManager
{
Person CreatePerson(字符串fn、字符串ln、日期时间dob、字符性别、Guid RId);
}
公共接口iLive上下文
{
人员保存(字符串fn,字符串ln);
}
}
/// 
///对一个人的测试
///
[TestMethod()]
public void CreatePersonTest1()
{
var mock=new mock();
//填满你想要的东西
mock.Setup(m=>m.Save(It.IsAny(),It.IsAny()).Returns(newperson{FirstName=“William”});
Manager t=新的管理器(mock.Object);
var results=t.CreatePerson(It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny());
Assert.AreEqual(“William”,results.FirstName);
}

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

Add:(此行初始化返回给定人员的方法)

mockDbSet.Setup(x=>x.Add(It.IsAny()))
.回报率(p=>p);
在模拟之间:

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);
...
var mockDbSet=new Mock();
mockDbSet.Setup(x=>x.Add(It.IsAny()))
.回报率(p=>p);
var mockContext=new Mock();
mockContext.Setup(x=>x.People)
.Returns(mockDbSet.Object);
...

您必须模拟设置CreatePerson方法。类似于mockContent.Setup(m=>m.CreatePerson(fn,ln,dob,gender,RId)).Returns(newperson){//your object here});我将尝试@chris,请将此代码部分下移
var-manager=new-manager(mockContext.Object)var personid=mockContext.Object.People.Single(x=>x.RowId==personGuid.Id
即使创建了对象,
personid
仍返回为
0
,您知道原因吗@OldFox@AaronLWG,这是因为
mockContext.Object.People
是一个模拟对象。。。使用
CreateMockSet
from创建你的
DbSet
,然后将
Callback
添加到我提供的设置中,在这个回调中,你将把给定的人放在列表中。老实说,这有点超出我的能力水平,所以我不太理解。我希望找到一种从模拟的
Person
对象中访问
Id
属性的方法,但不太确定@OldFox是否会起作用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SampleManager
{
    public class Manager : IManager
    {
        private IHiveTiesContext _ctx;
        public Manager(IHiveTiesContext context)
        {
            _ctx = context;
        }

        public Person CreatePerson(string fn, string ln, DateTime dob, char gender, Guid RId)
        {
            var person = _ctx.Save(fn, ln);
            return person;
        }
    }


    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public char Gender { get; set; }
        public DateTime DOB { get; set; }
        public Guid RowId { get; set; }
    }

    public interface IManager
    {
        Person CreatePerson(string fn, string ln, DateTime dob, char gender, Guid RId);
    }

    public interface IHiveTiesContext
    {
        Person Save(string fn, string ln);
    }
}

/// <summary>
    ///A test for CreatePerson
    ///</summary>
    [TestMethod()]
    public void CreatePersonTest1()
    {
        var mock = new Mock<IHiveTiesContext>();
        //fill up your expected object
        mock.Setup(m => m.Save(It.IsAny<string>(), It.IsAny<string>())).Returns(new Person { FirstName = "William" });

        Manager t = new Manager(mock.Object);
        var results = t.CreatePerson(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<DateTime>(), It.IsAny<Char>(), It.IsAny<Guid>());

        Assert.AreEqual("William", results.FirstName);
    }
mockDbSet.Setup(x => x.Add(It.IsAny<Person>()))
         .Returns <Person>(p => p);
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);
...