UnitTesing with Autofac,Moq-Getting Value不能为null异常



我使用的是EF6。生成的代码类似于:

public partial class MyDataContext : DbContext,IMyDataContext 
{
public MyDataContext() : base("name=mydata")
{
}
public virtual DbSet<getProjectsDraft> getProjectsDrafts { get; set; }
}

dbcontext接口类似于

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

我正在为DI使用Autofac,注册在我的global.asax.cs上完成,如下所示

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

我所有的DI都工作得很好,但当我使用xUnity实现单元测试时,我得到了低于错误的结果

基本测试代码:

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

和项目测试

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

然而,我在//Actdraftproject中得到了"Value cannot be null.rnParameter name: source"错误。

我做错了什么?

您差不多到了,DbSet被正确地模拟了,但查看该方法,您会注意到AsNoTracking方法实际上没有被模拟,它返回null

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

堆栈跟踪也提出了这一点:

System.ArgumentNullException HResult=0x80004003消息=不能为null。参数名称:来源

由于您已经在模拟DbSet,请尝试模拟AsNoTracking方法,例如:

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

最新更新