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)创建Person对象后,我无法在方法调用后移动该代码,因为需要先声明它@克丽索耶!我的错。为什么不创建一个函数,将Person对象保存在iLive上下文中?我将发布我的解决方案。谢谢你的帮助,现在我唯一的问题是我无法从我使用行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);
...