2016-02-12 129 views
1

我已经设法模拟一个实体框架dbcontext和dbset,以允许单元测试查询存储库组件的功能。单元测试方法使用AddOrUpdate实体框架6仓库

我一直无法对使用实体框架的AddOrUpdate()方法的方法执行成功的测试。收到的错误是:

“无法调用公用,派生IDbSet类型实例方法AddOrUpdate'Castle.Proxies.DbSet`1Proxy'。未找到方法。”

是否有可能对此进行测试?

private IRepository _Sut; 
    private Mock<DbSet<JobListing>> _DbSet; 
    private Mock<RecruitmentDb> _DbContext; 

    [SetUp] 
    public void Setup() 
    { 
     _DbContext = new Mock<RecruitmentDb>(); 

     var JobsData = GenerateJobs().AsQueryable(); 

     _DbSet = new Mock<DbSet<JobListing>>(); 
     _DbSet.As<IQueryable<JobListing>>().Setup(x => x.Provider).Returns(JobsData.Provider); 
     _DbSet.As<IQueryable<JobListing>>().Setup(x => x.Expression).Returns(JobsData.Expression); 
     _DbSet.As<IQueryable<JobListing>>().Setup(x => x.ElementType).Returns(JobsData.ElementType); 
     _DbSet.As<IQueryable<JobListing>>().Setup(x => x.GetEnumerator()).Returns(JobsData.GetEnumerator()); 

     _DbContext.Setup(x => x.JobListings).Returns(_DbSet.Object); 
     _Sut = new JobListingRepository(_DbContext.Object); 
    } 

    [Test] 
    public void Update_ChangedTitleProperty_UpdatedDetails() 
    { 
     var Actual = GenerateJobs().First(); 
     var OriginalJob = Actual; 
     Actual.Title = "Newly Changed Title"; 
     _Sut.Update(Actual); 

     Actual.Title.Should().NotBe(OriginalJob.Title); 
     Actual.Id.Should().Be(OriginalJob.Id); 
    } 

    private List<JobListing> GenerateJobs() 
    { 
     return new List<JobListing> 
     { 
      new JobListing{ Id = 1, 
      Title = "Software Developer", 
      ShortDescription = "This is the short description", 
      FullDescription = "This is the long description", 
      Applicants = new List<Applicant>(), 
      ClosingDate = DateTime.Now.AddMonths(5).Date}, 

      new JobListing{ 
      Id = 2, 
      Title = "Head Chef", 
      ShortDescription = "This is the short description", 
      FullDescription = "This is the long description", 
      Applicants = new List<Applicant>(), 
      ClosingDate = DateTime.Now.AddMonths(2).Date 
      }, 

      new JobListing 
     { 
      Id = 3, 
      Title = "Chief Minister", 
      ShortDescription = "This is the short description", 
      FullDescription = "This is the long description", 
      Applicants = new List<Applicant>(), 
      ClosingDate = DateTime.Now.AddMonths(2).Date 
     } 
     }; 
    } 
+0

我在代码中看不到'AddOrUpdate'。 –

+0

但它可能与'AddOrUpdate'是一个扩展方法有关。 –

+0

AddOrUpdate在具体的JobListingRepository中使用。如何使用扩展方法执行测试? – ManxJason

回答

1

问题是因为AddOrUpdate是一种扩展方法。我通过设计一个包装来克服这个问题。您可以模拟/存根IAddOrUpdateHelper接口。

public class AddOrUpdateHelper : IAddOrUpdateHelper 
    { 

     public void AddOrUpdateEntity<TEntity>(DataContext db, params TEntity[] entities) where TEntity : class 
     { 
      db.Set<TEntity>().AddOrUpdate(entities); 
     } 
    } 

    public interface IAddOrUpdateHelper 
    { 
     void AddOrUpdateEntity<TEntity>(DataContext db, params TEntity[] entities) where TEntity : class; 
    } 
+0

很好的答案,但是,你最有可能的意思是“DbContext”而不是“DataContext”。 – Ian

+0

复制和粘贴的危险 –

+0

@GregRTaylor我试图按照这个建议,但是得到了异常:'无法调用public,派生IDbSet上的实例方法AddOrUpdate 'Castle.Proxies.DbSet1Proxy'类型。找不到方法。 – Kenz