我正在尝试在我的应用程序开发中启动TDD,我正在使用xunit和moq来模拟测试实体框架操作的单元,我在测试更新或删除操作时没有任何问题,但不幸的是因为没有在这个主题上经验丰富,我在检查特定实体的添加方法时遇到了问题。 每当我想在执行SaveChanges()之后测试add方法时,我的上下文是一个模拟实体列表被设置为null,所以我不能再在我的业务代码中使用这个上下文了。 我用作参考的链接如下:
https://msdn.microsoft.com/en-us/data/dn314429.aspx#virtual
这是我的商家代码:
public class PersonBL
{
/// <summary>
/// DataContext item of this business.
/// </summary>
private UnitTestSampleEntities DataContext;
/// <summary>
/// Initializes a new instance of the <see cref="PersonBL"/> current business class for Person.
/// </summary>
/// <param name="dataContext">The data context.</param>
public PersonBL()
{
this.DataContext = new UnitTestSampleEntities();
}
public PersonBL(UnitTestSampleEntities dbContext)
{
this.DataContext = dbContext;
}
/// <summary>
/// Adds the new person.
/// </summary>
/// <param name="person">The person.</param>
public void AddPerson(Person person)
{
this.DataContext.People.Add(person);
this.DataContext.SaveChanges();
}
public void UpdatePerson(Person person)
{
var p = this.DataContext.People.Where(i => i.ID == person.ID).FirstOrDefault<Person>();
if (p != null)
{
p.FirstName = person.FirstName;
p.LastName = person.LastName;
p.PhoneNo = person.PhoneNo;
}
this.DataContext.SaveChanges();
}
public void DeletePerson(Person person)
{
var p = this.DataContext.People.Where(i => i.ID == person.ID).FirstOrDefault<Person>();
if (p != null)
{
this.DataContext.People.Remove(p);
}
this.DataContext.SaveChanges();
}
public List<Person> GetPeopleListByDeptID(int deptID)
{
return (from person in this.DataContext.People
select person)
.Where(i => i.DeptId == deptID)
.ToList();
}
}
这是我的测试方法:
[Fact]
public void TestAddPerson2()
{
//Prepare the data
var data = new List<Person>
{
new Person { ID=1,
FirstName="Joey",
LastName="Clark",
PhoneNo="02188882525",
DeptId=1},
new Person {ID=2,
FirstName="John",
LastName="Peterson",
PhoneNo="02188884747",
DeptId=1},
new Person {ID=3,
FirstName="Ross",
LastName="Geller",
PhoneNo="02188883366",
DeptId=1},
}.AsQueryable();
var mockSet = new Mock<DbSet<Person>>();
mockSet.As<IQueryable<Person>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Person>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Person>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new Mock<UnitTestSampleEntities>();
int addCount = 0;
//setup the mock context
// mockContext.Setup(m => m.People).Returns(mockSet.Object);
mockContext.Setup(m => m.People).Callback(() => addCount++);
// mockContext.Setup(m => m.Add(It.IsAny<Person>())).Callback(() => addCount++);
var personBL = new PersonBL(mockContext.Object);
var person = new Person()
{
FirstName = "John",
LastName = "Clark",
PhoneNo = "02188887788"
};
personBL.AddPerson(person);
Assert.Equal(4, data.Count());
mockSet.Verify(m => m.Add(It.IsAny<Person>()), Times.Once());
mockContext.Verify(m => m.SaveChanges(), Times.Once());
}
我正在寻找一种方法来检查保存新记录后的记录数,或检查实体属性的值,以及在添加操作后使用DataContext的方法(为什么它为null?)
答案 0 :(得分:1)