使用 Moq 对 dbContext 的添加操作进行单元测试

问题描述 投票:0回答:1

我正在尝试在我的应用程序开发中启动 TDD,我正在使用 xunit 最小起订量来模拟测试实体框架操作的单元,我在测试更新或删除操作时没有任何问题,但不幸的是,因为没有经验在本主题中,我在检查特定实体的添加方法时遇到问题。 每当我想在执行 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 的方法(为什么它为空?)

c# entity-framework unit-testing moq xunit
1个回答
1
投票

使用存储库模式。并为您的单元测试准备一个 MockRepository。

请参阅我的回答:

如何编写数据访问的单元测试?

© www.soinside.com 2019 - 2024. All rights reserved.