2016-06-21 72 views
-1

我尝试使用NUnit和Moq的单元测试服务,它访问数据。我创建的DbContext的模拟像这样:EF模拟不使用预先加载

我的实体和上下文

public class BloggingContext : DbContext 
{ 
    public virtual DbSet<Blog> Blogs { get; set; } 
    public virtual DbSet<Post> Posts { get; set; } 
} 

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 
    public string Url { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

测试方法:

public void CreateBlog_saves_a_blog_via_context() 
    { 
     var data = new List<Blog> 
     { 
      new Blog { Name = "BBB" }, 
      new Blog { Name = "ZZZ" }, 
      new Blog { Name = "AAA" }, 
     }.AsQueryable(); 

     var data2 = new List<Blog> 
     { 
      new Post{ Title= "BBB" }, 
      new Post{ Title= "ZZZ" }, 
      new Post{ Title= "AAA" }, 
     }.AsQueryable(); 

     var mockSet = new Mock<DbSet<Blog>>(); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator()); 

     var mockSet2 = new Mock<DbSet<POs>>(); 
     mockSet2.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data2.Provider); 
     mockSet2.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data2.Expression); 
     mockSet2.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data2.ElementType); 
     mockSet2.As<IQueryable<Post>>().Setup(m => m.GetEnumerator()).Returns(data2.GetEnumerator()); 

     var mockContext = new Mock<BloggingContext>(); 
     mockContext.Setup(c => c.Blogs).Returns(mockSet.Object); 
     mockContext.Setup(c => c.Posts).Returns(mockSet2.Object); 
     var service = new BlogService(mockContext.Object); 
     var blogs = service.GetAllBlogs(); 
    } 

但当我不会设置实体之间的关系我测试他们

Post = new Post(){ 
    Title ="", 
    Content = "", 
    BlogID = 2 
}; 

但导航性能测试(在正常设置其设置)没有设置。当我尝试从上下文中阅读这篇文章时,我总是有null,但BlogID已经设置。

+0

我认为你有一个复制粘贴错误的AR数据2 =新名单 应张贴正确的吗? –

+0

你在博客收集新的博客设置{名称=“BBB”,帖子=新名单(){新邮{标题=“BBB”},...... }}, –

回答

2

我想这个单元测试不同的方式,看你的单元测试的名称,你只是想确保如下时创建的博客时,将正确的数据传递到的DbContext ..你可以这样做;

[TestMethod] 
    public void CreateBlog_saves_a_blog_via_context() 
    { 
     var mockContext = new Mock<BloggingContext>(); 

     // Add related posts directly into fake blog data 
     var data = new List<Blog> 
     { 
      new Blog {Name = "BBB", Posts = new List<Post>() { new Post() { Title = "Post1"} } }, 
      new Blog {Name = "ZZZ", Posts = new List<Post>() { new Post() { Title = "Post2"} } }, 
      new Blog {Name = "AAA", Posts = new List<Post>() { new Post() { Title = "Post3"} } }, 
     }.AsQueryable(); 

     var mockSet = new Mock<DbSet<Blog>>(); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType); 
     mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator()); 

     mockContext.Setup(c => c.Blogs).Returns(mockSet.Object); 

     var service = new BlogService(mockContext.Object); 

     var newBlog = new Blog {Name = "A New Blog", Posts = new List<Post>() {new Post() {Title = "Post1"}}}; 

     // Add new Blog to service 
     service.AddBlog(newBlog); 

     // Check that DbContext received the new blog correctly 
     // And Blog contained correct name and Post count of 1 
     mockSet.Verify(x=>x.Add(It.Is<Blog>(blog=>blog.Name == "A New Blog" && blog.Posts.Count == 1))); 
    } 

正如我希望你能看到,你是确保被测类正确传递正确的对象到的DbContext。现在,您还可以进行其他的断言,如确认在的DbContext调用SaveChanges()方法也被称为一次。

测试类,而不是的DbContext

+0

哦,谢谢你,我早点了,但我会喜欢你的工作。祝你今天愉快! –