我有一个EFDbContext,它声明了实体框架数据库上下文。
我不需要它的接口,但我显然被 Moq 强迫只能模拟接口。
有没有办法模拟一个具体的方法,但只是把它当作一个接口?
代码正在中断:
[TestClass]
public class EFBlogRepositoryTest
{
[TestMethod]
public void Test_GetAllBlogs()
{
// Arrange
DateTime now = DateTime.Now;
var mockDbContext = new Mock<EFDbContext>();
var blogRepository = new EFBlogRepository(mockDbContext.Object);
List<Blog> blogs = new List<Blog> {
new Blog { BlogID = 1, Description = "1", Status = true, PublishDate = now },
new Blog { BlogID = 2, Description = "2", Status = true, PublishDate = now }
};
mockDbContext.Setup(c => c.Blogs).Returns(blogs); // ERROR OCCURS HERE
// Act
List<Blog> result = blogRepository.GetAllBlogs(1, 2, SortDirection.DESC, null, null).ToList();
// Assert
Assert.AreEqual(2, result.Count());
}
}
不,这不是它的工作原理。模拟对象是接口的(部分)实现,作为实际实现的替代方法。
所以当你说
我不需要接口
。你现在做。
只能模拟接口上的方法/属性或类上的虚拟方法/属性。
所以,你要么需要一个接口(这是你应该做的),要么如果你真的,真的不想,那么你可以声明.博客是虚拟的。
请注意,要设置属性,您应该使用 .SetupGet,而不是安装程序。