当前位置: 首页 > 知识库问答 >
问题:

使用AddOrUpdate和Entity Framework6存储库的单元测试方法

唐茂实
2023-03-14

我已经设法模拟了一个实体框架dbcontext和dbset,以允许针对存储库组件进行单元测试、查询功能。

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

“无法对派生得IDbSet类型”Castle.proxies.dbSet“1Proxy”调用公共实例方法AddOrUpdate.找不到方法.“

有可能测试这个吗?

    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
        }
        };
    }

共有1个答案

澹台建华
2023-03-14

这个问题是因为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;
    }
 类似资料:
  • 我正在使用Spring Boot进行多模块项目。我想编写一些单元测试来检查我的存储库,服务等。存储库代码是在公共项目上编写的,而公共项目在其他项目上使用。此项目不包含任何初学者应用。它只是由实体、存储库和服务组成。 我看到这个主题(如何使用Spring Boot测试Maven模块项目)关于类似的问题,但我没有设法成功地实现它来测试我的存储库。 当我启动测试时,EntityARepository会引

  • 我有一个问题与存根我的存储库。有人建议我只创建另一个application.properties(我没有这样做),并使用像H2这样的内存数据库。不过,我想知道我是否可以只是存根调用,这样当调用MyDataService.FindById(id)而不是试图从数据库中获取它时,就可以返回一个模拟对象?

  • 但是有没有一种方法可以用我的SQL存储库做同样的事情,并让EntityManger对测试数据库执行nativeQuery呢? 我还没弄明白。

  • } 然后我有我的服务课,看起来像这样 然后是我的存储库:

  • 我有一个Spring Data JPA存储库,只要不添加Spring Security性依赖项(spring-boot-starter-security)并在存储库上添加相应的方法授权注释,单元测试就可以正常工作。添加后,在运行单元测试时,我会得到一个AuthenticationCredentialsNotFound异常。 如何在单元测试中“验证”对存储库方法的调用?

  • 我是spring的新手,目前我正在尝试为我的项目执行单元测试。我已经用hibernate配置了spring,现在我想检查创建的类的方法是否工作。例如,假设我有: 如何正确测试这些方法?最好的选择是什么?我习惯在JUnit测试中使用assertTrue和assertFalse,但我担心这在我的情况下不是一个好的选择。谢谢你。