我的服务没有通过其构造函数获取我的模拟DbContext

时间:2014-10-21 12:35:26

标签: c# entity-framework unit-testing mocking inversion-of-control

我尝试创建一个假的db上下文,将其传递给我的服务,以便从服务中测试我的函数。我得到的错误是:对象引用未设置为对象的实例。发生这种情况是因为我的服务没有获得新的模拟上下文。我知道这是因为通过调试器观看了它。

这是我的单元测试代码:

        [TestMethod]
        public void VerifiesIfGetPersonByNameReturnsAValidPerson()
        {
            //Arrange
            var data = new List<Person>
            {
                new Person {Name = "Ana"},
                new Person {Name = "Marius"},
                new Person {Name = "George"},
            }.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<PersonDbContext>();
            mockContext.Setup(c => c.Persons).Returns(mockSet.Object);
            var service = new PersonService(mockContext.Object);
            var expected = "Marius";

            //Act
            var personDto = service.GetPersonByName("Marius");
            var actual = personDto.Name;

            //Assert
            Assert.AreEqual(expected,actual);
        }

这是我的服务代码:

public class PersonService : IPersonService
    {
        private PersonDbContext _db; 

        public PersonService(PersonDbContext db)
        {
            _db = db;
        }

    public PersonDto GetPersonByName(string name)
    {
        PersonDto personDto = Mapper.Map<PersonDto>(_db.Persons.Find(name));
        return personDto;
    }
...}

为什么服务不会通过其构造函数获取新的上下文?或者问题是什么?为什么我执行GetPersonByName方法时会一直得到null结果?

0 个答案:

没有答案