【发布时间】:2016-01-14 18:10:47
【问题描述】:
我刚刚在我的应用程序中添加了依赖注入,并希望对我的方法运行模拟测试以确保它们正常工作。
我有一个域类 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; }
}
我有一个与其他域类型管理器共享的部分 manager 类:
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; }
}
最后我尝试像这样测试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());
}
}
我的问题是我的Person 对象从未被创建,也就是说,它总是返回一个null 值并且总是抛出异常。我相信我告诉它返回一个Person 实体,但我不确定我哪里出错了。这是我第一次使用Moq 并运行Mock Unit Tests。
感谢任何建议。谢谢。
【问题讨论】:
-
您必须模拟设置 CreatePerson 方法。类似于 mockContent.Setup(m => m.CreatePerson(fn, ln, dob, gender, RId)).Returns(new Person){ //your object here });
-
我会试试@Chris
-
在创建 Person 对象后,请向下移动此代码部分
var manager = new Manager(mockContext.Object);。 -
我无法在方法调用之后移动该代码,因为它需要先声明。 @克里斯
-
哦,是的!我的错。为什么不创建一个在 IHiveTiesContext 中保存 Person 对象的函数?我将发布我的解决方案。
标签: c# entity-framework unit-testing mocking moq