UnitTesing с Autofa c, Moq - получение значения не может быть нулевым исключением - PullRequest
1 голос
/ 16 марта 2020

Я использую EF6. Сгенерированный код выглядит примерно так:

public partial class MyDataContext : DbContext,IMyDataContext 
{
    public MyDataContext() : base("name=mydata")
    {
    }

    public virtual DbSet<getProjectsDraft> getProjectsDrafts { get; set; }
}

, а интерфейс dbcontext выглядит следующим образом:

public interface IMediciDbContext : IDisposable
{
     DbSet<getProjectsDraft> getProjectsDrafts { get; set; }
}

Я использую Autofa c для DI, и регистрация выполняется в мой global.asax.cs как показано ниже

// Entity Registering
builder.RegisterType<MyDataContext>().As<IMyDataContext>();

Все мои DI работают нормально, но когда я реализовал модульное тестирование с использованием xUnity, я получаю сообщение об ошибке (показано ниже).

Basetest Code:

public class BaseTest
{
    public static Mock<DbSet<T>> CreateDbSetMock<T>(IEnumerable<T> elements) where T : class
    {
        var elementsAsQueryable = elements.AsQueryable();
        var dbSetMock = new Mock<DbSet<T>>();
        dbSetMock.As<IQueryable<T>>().Setup(m => m.Provider).Returns(elementsAsQueryable.Provider);
        dbSetMock.As<IQueryable<T>>().Setup(m => m.Expression).Returns(elementsAsQueryable.Expression);
        dbSetMock.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(elementsAsQueryable.ElementType);
        dbSetMock.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(elementsAsQueryable.GetEnumerator());

        return dbSetMock;
    }
}

и Project Test

public class Projects_Test : BaseTest
{
        [Fact]
        public void GetDraftProjectsList()
        {
            // Arrange
            var fixture = new Fixture();
            var draftProjects = new List<getProjectsDraft>
             {
                fixture.Create<getProjectsDraft>()
             };
            var draftMock = CreateDbSetMock(draftProjects);
            var myDataContextMock= new Mock<IMyDataContext>();
            myDataContextMock.Setup(x => x.getProjectsDrafts).Returns(draftMock.Object);
            var projectService = new ProjectRepo(mediciContextMock.Object);

            // Act
            var draftproject = projectService.GetDraftProjects(true, "test-02", "Test");

            // Assert
            Assert.NotNull(draftproject);
        }
}

Однако я получаю сообщение об ошибке

"Значение не может быть нулевым. \ R \ nИмя параметра: источник"

в разделе //Act черновика проекта.

Что я делаю не так?

Ошибка трассировки стека

System.ArgumentNullException
  HResult=0x80004003
  Message=Value cannot be null.
Parameter name: source
  Source=System.Core
  StackTrace:
   at System.Linq.Queryable.OrderByDescending[TSource,TKey](IQueryable`1 source, Expression`1 keySelector)
   at BusinessLayer.ProjectRepo.GetDraftProjects(Boolean IsOwner, String LoginName, String cbName) in F:\Workspace\BusinessLayer\ProjectUploadRepo.cs:line 473
   at UntiTesting.RepoTesting.Projects_Test.GetDraftProjectsList() in F:\Workspace\UntiTesting\RepoTesting\Projects_Test.cs:line 38

и запрос linq, где я получаю ошибку

lstDraftProj = (from proj in mydbEntities.getProjectsDrafts.AsNoTracking()
                orderby proj.ProjectID descending
                select proj).ToList();

" getProjectsDraft.cs "это класс dbContext, сгенерированный EF6

namespace XyzProz.DataAccess
{
    using System;
    using System.Collections.Generic;

    public partial class getProjectsDraft
    {
        public int ProjectID { get; set; }
        public string OrderNo { get; set; }
        public string CNumber { get; set; }
        public string Region { get; set; }
        public string Department { get; set; }
        public string Location { get; set; }
        public Nullable<byte> StatusID { get; set; }
        public string Status { get; set; }
        public Nullable<System.DateTime> Modified { get; set; }
    }
}

1 Ответ

1 голос
/ 17 марта 2020

Вы почти на месте, DbSet правильно смоделирован, но, глядя на метод, вы заметите метод AsNoTracing, который на самом деле не смоделирован и возвращает null.

lstDraftProj = (from proj in mydbEntities.getProjectsDrafts.AsNoTracking()
                orderby proj.ProjectID descending
                select proj).ToList();

Это также предлагается при трассировке стека:

System.ArgumentNullException HResult = 0x80004003 Сообщение = Значение не может быть нулевым . Имя параметра: источник

Поскольку вы уже издеваетесь DbSet, попробуйте также смоделировать метод AsNoTracing, например:

draftMock.Setup(x => x.AsNoTracking()).Returns(draftMock.Object)
...