我尝试创建一个假的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结果?