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

时间:2015-02-02 06:47:43

标签: c# entity-framework unit-testing moq xunit

我正在尝试在我的应用程序开发中启动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?)

1 个答案:

答案 0 :(得分:1)

使用存储库模式。并为您的单元测试提供MockRepository。

请在此处查看我的回答:

How to write unit tests for data access?