【发布时间】:2017-03-20 14:50:54
【问题描述】:
我是单元测试的新手,希望编写一个 N 层应用程序,因此我的 ORM 是从 BLL 中抽象出来的,中间有一个存储库模式。我将如何对与 EF (DbContext) 耦合的存储库模式方法进行单元测试?
我的 SUT 方法在这里:
public IList<Volunteer> GetAllVolunteers() {
return dbctx.Volunteer.ToList();
}
到目前为止我的单元测试:
[Fact]
public void GetAllVolunteersMethodWorks() {
// Arrange
var fakeVolunteer = new Volunteer { Id = 0, Name = "Dummy" };
var expected = new List<Volunteer>(new Volunteer[] { fakeVolunteer });
var mockedCtxVolunteer = new Mock<DbSet<Volunteer>>();
mockedCtxVolunteer.Setup(m => m.ToList()).Returns(expected);
var mockedctx = new Mock<RSMContext>();
mockedctx.Setup(m => m.Volunteer).Returns(mockedCtxVolunteer.Object);
// Act
var volunteerRepo = new VolunteerRepository(mockedctx.Object);
var result = volunteerRepo.GetAllVolunteers();
// Assert
Assert.Equal(expected, result);
}
我收到一个错误 System.NotSupportedException: 'Expression references a method that does not contain the mocked object: m => m.ToList() 那么如何正确模拟 DbSet,以便我的假数据驻留在那里以正确测试我的 VolunteerRepository.GetAllVolunteers() 方法是否有效?
编辑(解决方案):
var mockedDbCtxVolunteer = new Mock<DbSet<Volunteer>>();
mockedDbCtxVolunteer.As<IQueryable<Volunteer>>().Setup(m => m.GetEnumerator()).Returns(expected.GetEnumerator());
【问题讨论】:
-
我建议该方法不需要测试,因为您不是在测试自己的代码。
-
好吧,在这个例子中,我的 GetAllVolunteers() 方法非常基本,但我的想法是我的 repo 在其他方法中会有更复杂的逻辑。所以让它发挥作用的想法以后会更有价值
标签: c# entity-framework unit-testing moq