ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 将Moq与实体框架6结合使用 – 模拟包含和位置

2019-06-08 13:04:33  阅读:247  来源: 互联网

标签:c unit-testing entity-framework moq entity-framework-6


我正在尝试使用Moq并使用EntityFramework.Testing.Moq扩展方法创建一些内存中的dbContext模拟:

https://github.com/scott-xu/EntityFramework.Testing

当我尝试使用模拟上下文对我急切加载的查询进行单元测试时,我正在打砖墙.问题是,根本没有选择任何东西.我知道应该选择一些东西,因为当我使用LINQPad将相同的查询指向我的源数据库时,我得到了我期望的2个结果.

我不知道我需要发布多少代码等,所以希望以下内容有所帮助.

数据图

我有两个主表,dbo.Applicant基本上保存用户详细信息,dbo.Application,它保存作业应用程序,有dbo.Application挂钩的查找表:

Diagram

示例模型

这是基于上图的代码优先方法.我删除了属性以保持代码清洁,并且问题的重点是:

[Table("Application")]
public partial class Application
{
    [Min(1)]
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string ApplicationId { get; set; }

    [Min(1)]
    public int ApplicantId { get; set; }

    public virtual Applicant Applicant { get; set; }     
}

[Table("Applicant")]
public partial class Applicant
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Applicant()
    {
        Applications = new HashSet<Application>();
        RowStatus = "L";
    }

    public int Id { get; set; }

    [Required]
    public string FullName { get; set; }

    [Required]
    public string AddressLine1 { get; set; }

    [Required]
    public string Email { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Application> Applications { get; set; }
}

上下文

再次减少上下文,但以防万一我在评论中要求它:

public partial class WorkExperienceContext : DbContext
{
    public WorkExperienceContext()
        : base("name=WorkExperienceContext")
    {
        this.Configuration.LazyLoadingEnabled = false;

    }

    public WorkExperienceContext(string userTestConnectionString)
        : base(userTestConnectionString)
    {
        Trace.Write("Using test context " + Add to dictionary);
    }

    public virtual DbSet<Applicant> Applicants { get; set; }
    public virtual DbSet<Application> Applications { get; set; }

}

单元测试方法

以下是(再次)Unit测试方法的简化版本,我希望根据电子邮件提取两个应用程序记录.

从下面可以看到,有:

> 2 Lucifer的申请记录(ApplicantId = 666)
>有一份申请人记录,其中包含misunderstood@fireandbrimestone.co.uk的电子邮件

我的问题是test为null,当使用相同的代码查询数据库本身时,我得到了正确的结果.我很困惑我需要做什么.请记住,我正在使用EntityFramework.Testing.Moq.SetupData()方法来处理DbSet方法的模拟并转换List<>将数据播种到IQueryable集合.

    public void InMemory_Find_Application_By_Email_EFMoq()
    {

        var applications = new List<Application>
        {
            new Application { Id = 1, ApplicantId = 666, ApplicationId = "1-a", DivisionId = 2, PublishingAreaId = 4, SourceId = 2, SkillsLearnt = "How to pick up  pen", RowStatus="L", ApplicantStartDateId = 1,
                ApplicantDisabilityId = 2, CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay } ,
            new Application { Id = 2, ApplicantId = 666, ApplicationId = "1-a", DivisionId = 3, PublishingAreaId = 4, SourceId = 2, SkillsLearnt = "How to pick up  pen", RowStatus="L", ApplicantStartDateId = 1,
                ApplicantDisabilityId = 2,CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay   } ,
            new Application { Id = 3, ApplicantId = 5, ApplicationId = "1-b", DivisionId = 3, PublishingAreaId = 1, SourceId = 2, SkillsLearnt = "Reading a book well" , RowStatus="L", ApplicantStartDateId = 1,
                ApplicantDisabilityId = 2,CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay     } ,
            new Application { Id = 4, ApplicantId = 5, ApplicationId = "1-b", DivisionId = 2, PublishingAreaId = 1, SourceId = 2, SkillsLearnt = "Reading a book well ", RowStatus="L", ApplicantStartDateId = 1,
                ApplicantDisabilityId = 2  ,CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay   } ,
            new Application { Id = 5, ApplicantId = 5, ApplicationId = "1-b", DivisionId = 7, PublishingAreaId = 1, SourceId = 2, SkillsLearnt = "Reading a book well" , RowStatus="L", ApplicantStartDateId = 1,
                ApplicantDisabilityId = 2 ,CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay    } ,
            new Application { Id = 6, ApplicantId = 24, ApplicationId = "1-c", DivisionId = 10, PublishingAreaId = 3, SourceId = 1, SkillsLearnt = "I can now re-iterate stuff", RowStatus="L", ApplicantStartDateId = 1,
                ApplicantDisabilityId = 2,CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay  },
            new Application { Id = 7, ApplicantId = 21, ApplicationId = "1-d", DivisionId = 2, PublishingAreaId = 2, SourceId = 1, SkillsLearnt = "I made some bread the other day", RowStatus="L", ApplicantStartDateId = 1,
                ApplicantDisabilityId = 2 ,CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay   }
        };

        var applicants = new List<Applicant>
        {
            new Applicant {Id = 5, FullName = "Pen Is", AddressLine1="Somewhere Over the Rainbow", County="West Sussex", Email="pen_is@hotmail.co.uk", RowStatus = "L",
            GenderId = 2, EducationId = 1, CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay, PostCode="PEN 1ST", Telephone="N/A"},
            new Applicant {Id = 24, FullName = "Gareth Bradley", AddressLine1="an address", County="West Sussex", Email="gareth.bradley@hachette.co.uk", RowStatus = "L",
            GenderId = 2, EducationId = 1, CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay, PostCode="bn13 3qb",Telephone="N/A"}  ,
            new Applicant {Id = 21, FullName = "Lizzy Windsor", AddressLine1="A Palace (Take your pick)", County="Berkshire", Email="HerRoyalMaj@TheCrownJewels.co.uk", RowStatus = "L",
            GenderId = 2, EducationId = 1, CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay, PostCode="BE1 1HM",Telephone="N/A"} ,
            new Applicant {Id = 666, FullName = "Lucifer MorningStar", AddressLine1="Hotsy Street", County="Down South", Email="misunderstood@fireandbrimes1one.co.uk" , RowStatus = "L",
            GenderId = 3, EducationId = 1, CreatedDate = DateTime.Now, CreatedTime = DateTime.Now.TimeOfDay, PostCode="HE11 6SS",Telephone="666-666"}
        };


        foreach (Applicant applicant in applicants)
        {
            applicant.Applications = applications.Where(a => a.ApplicantId == applicant.Id).ToArray();

        }

        foreach (Application application in applications)
        {
            application.Applicant = applicants.SingleOrDefault(a => a.Id == application.ApplicantId);
        }

        var mockSet = new Mock<DbSet<Application>>()
            .SetupData(applications);

        var mockSetUsers = new Mock<DbSet<Applicant>>()
            .SetupData(applicants);

        var mockContext = new Mock<WorkExperienceContext>();
        mockContext.Setup(c => c.Applications).Returns(mockSet.Object);
        mockContext.Setup(c => c.Applicants).Returns(mockSetUsers.Object);

        var mockService = new WorkExperienceFormService(mockContext.Object);

        var test = mockContext.Object
                 .Applications
                 .Include(a => a.Applicant)
                 .Where(e => e.Applicant.Email == "misunderstood@fireandbrimestone.co.uk")  
                 .ToList();

        Assert.AreEqual(2, test.Count());
    }

以下是我的LINQPad在没有模拟上下文的情况下提取数据的证据:

enter image description here

解决方法:

也许这是你发布代码时的错字,但是’Lucifer MorningStar’的电子邮件是
misunderstood@fireandbrimes1one.co.uk而不是
misunderstood@fireandbrimestone.co.uk

标签:c,unit-testing,entity-framework,moq,entity-framework-6
来源: https://codeday.me/bug/20190608/1197921.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有