Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的模拟对象没有返回结果?_C#_Entity Framework_Unit Testing_Moq - Fatal编程技术网

C# 为什么我的模拟对象没有返回结果?

C# 为什么我的模拟对象没有返回结果?,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,我正在尝试创建一个模拟DBContext和DbSet。我认为我正确地设置了DBContext,反过来,设置了DbSet,但即使我向DbSet添加了元素,它仍然返回null 我是不是做错了什么 首先,我按如下方式进行设置: [SetUp] public void Setup_Tests() { Database.SetInitializer(new DropCreateDatabaseAlways<SubscriptionManagementContext>());

我正在尝试创建一个模拟
DBContext
DbSet
。我认为我正确地设置了
DBContext
,反过来,设置了
DbSet
,但即使我向
DbSet
添加了元素,它仍然返回null

我是不是做错了什么

首先,我按如下方式进行设置:

[SetUp]
public void Setup_Tests()
{
    Database.SetInitializer(new DropCreateDatabaseAlways<SubscriptionManagementContext>());

    var mock = new Mock<SubscriptionManagementContext>();
    mock.Setup(xx => xx.UIElements).Returns(GetMockDBSet(SubManInitializer.GetUIElements));

    _subscriptionManagementContext = mock.Object;
}
此处
setupAction.Invoke()
应返回
GetUIElements()中定义的
列表

我需要做什么来确保
ui元素
将包含数据

编辑

根据请求,堆栈跟踪:

at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName)
at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi)
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments)
at System.Linq.Queryable.Any[TSource](IQueryable`1 source)
at tstReportSubscriptionManagement.Test.SubManTests.Can_Get_UIElements() in c:\git\tst\tstReportSubscriptionMgmt\tstReportSubscriptionManagement.Test\SubManTests.cs:line 74

由于模拟的
DbSet
旨在处理
IQueryable
数据,
AddRange
不足以使其像常规的
列表一样工作

您需要模拟缺少的
IQueryable的实现:

private static DbSet GetMockDBSet(Func setupAction),其中T:class
{
var mockDBSet=new Mock();
var mockedData=setupAction.Invoke().AsQueryable();
mockDBSet.As().Setup(x=>x.Provider).返回(mockedData.Provider);
mockDBSet.As().Setup(x=>x.Expression).Returns(mockedData.Expression);
mockDBSet.As().Setup(x=>x.ElementType).Returns(mockedData.ElementType);
mockDBSet.As().Setup(x=>x.GetEnumerator()).Returns(mockedData.GetEnumerator());
返回mockDBSet.Object;
}

显示堆栈跟踪我已经用堆栈跟踪更新了问题。没有内在的例外。
private static DbSet<T> GetMockDBSet<T>(Func<List<T>> setupAction) where T : class
{
    var mockDBSet = new Mock<DbSet<T>>();

    mockDBSet.Setup(xx => xx.AddRange(setupAction.Invoke()));

    return mockDBSet.Object;
}   

public static List<UIElement> GetUIElements()
{
    var uiElements = new List<UIElement>
    {
        new UIElement {ElementName = "EmailDetails" },
        new UIElement {ElementName = "SFTPDetails"      },
        new UIElement {ElementName = "ScheduleDetails"  },
        new UIElement {ElementName = "FileNameElement"  },
    };
    return uiElements;
}
[Test]
public void Can_Get_UIElements()
{
    var uiElements = _subscriptionManagementContext.UIElements;

    Assert.IsNotNull(uiElements);

    Assert.IsTrue(uiElements.Any()); // throws System.ArgumentNullException 
}
at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName)
at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi)
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments)
at System.Linq.Queryable.Any[TSource](IQueryable`1 source)
at tstReportSubscriptionManagement.Test.SubManTests.Can_Get_UIElements() in c:\git\tst\tstReportSubscriptionMgmt\tstReportSubscriptionManagement.Test\SubManTests.cs:line 74
private static DbSet<T> GetMockDBSet<T>(Func<List<T>> setupAction) where T : class
{
    var mockDBSet = new Mock<DbSet<T>>();
    var mockedData = setupAction.Invoke().AsQueryable();

    mockDBSet.As<IQueryable<T>>().Setup(x => x.Provider).Returns(mockedData.Provider);
    mockDBSet.As<IQueryable<T>>().Setup(x => x.Expression).Returns(mockedData.Expression);
    mockDBSet.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(mockedData.ElementType);
    mockDBSet.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(mockedData.GetEnumerator());

    return mockDBSet.Object;
}