Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 尝试通过模拟枚举时出现NullReferenceException_C#_Unit Testing_Kentico_Justmock - Fatal编程技术网

C# 尝试通过模拟枚举时出现NullReferenceException

C# 尝试通过模拟枚举时出现NullReferenceException,c#,unit-testing,kentico,justmock,C#,Unit Testing,Kentico,Justmock,我遇到了一个奇怪的NullReferenceException,在尝试模拟要枚举的集合时,我无法理解它。我不认为这是由Mock引起的,但我不是100%确定。有人能认出我在做什么傻事吗 InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID); foreach (OrderItemInfo orderItem in orders) { // Excepti

我遇到了一个奇怪的NullReferenceException,在尝试模拟要枚举的集合时,我无法理解它。我不认为这是由Mock引起的,但我不是100%确定。有人能认出我在做什么傻事吗

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach (OrderItemInfo orderItem in orders)
{
    // Exception thrown on the first attempt to get an OrderItem in the foreach
}
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach(订单中的OrderItemInfo orderItem)
{
//首次尝试在foreach中获取OrderItem时引发异常
}
这行代码的堆栈跟踪如下所示:

System.NullReferenceException:对象引用未设置为实例
指一个物体。结果StackTrace:at
CMS.SettingsProvider.ObjectDataSet
1.GetEnumerator()位于
CMS.SettingsProvider.ObjectDataSet
1.GetObjectEnumerator()位于
CMS.SettingsProvider.InfoDataSet`1.d_u0.MoveNext()

集合的内容只是IEnumerable的包装。在我的情况下,这应该给你一个关于发生了什么的想法。GetEnumerator(隐式和非隐式)实现只是调用值

    private IEnumerable<T> values;

    /// <summary>
    /// Initializes a new instance of the <see cref="MockDataSet{T}"/> class.
    /// </summary>
    /// <param name="values">The values.</param>
    public MockDataSet(IEnumerable<T> values)
    {
        if (values == null)
            throw new ArgumentNullException("values");

        this.values = values;
    }
私有IEnumerable值;
/// 
///初始化类的新实例。
/// 
///价值观。
公共MockDataSet(IEnumerable值)
{
如果(值==null)
抛出新的ArgumentNullException(“值”);
这个值=值;
}
值中只有一个值,我可以通过watch窗口很好地枚举它


谁能解释一下我做错了什么吗?

orders
为空。您认为这不是因为循环已经启动,而是因为这是一个惰性的过程

像这样更改代码,它不会失败:

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
if (orders != null)
{
  foreach (OrderItemInfo orderItem in orders)
  {
      // Exception thrown on the first attempt to get an OrderItem in the foreach
  }
}
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
如果(订单!=null)
{
foreach(订单中的OrderItemInfo orderItem)
{
//首次尝试在foreach中获取OrderItem时引发异常
}
}

还请记住,每当您在调试器中查看某个内容时,很长一段时间都是以周期的形式过去的——如果您有任何异步更新,它可能还没有完成。

这有点奇怪,我认为这部分是由于下面的CMS(Kentico)。早些时候我遇到了一个问题,我在上面贴了一个问题,我刚刚意识到这可能会产生同样的影响

似乎
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID)的结果对于编译器来说很难确定类型。因此,我认为演员阵容正在形成

((IEnumerable)订单)

我认为这是失败的,导致IEnumerable为null,从而导致NullReferenceException。解决方案是对每个项目的简单转换:

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach (OrderItemInfo orderItem in orders.Cast<OrderItemInfo>())
{
   // Now works
}
InfoDataSet orders=OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID);
foreach(orders.Cast()中的OrderItemInfo orderItem)
{
//现在起作用了
}

恐怕订单不是空的。。。如表中所示,它已填充。我尝试了空引用检查,但以完全相同的方式失败(请注意,我在运行测试之前卸下了手表)。@Ian-Oh,如果你发布了一张图片,我看不到它。(防火墙)。你有和上面一样的代码吗?第一次尝试使用orderItem是什么样子的?Hogan-即将发布关于为什么的答案。对不起,是的,我确实包括了一个image@lan为什么不在foreach中显示一些代码呢。这会给我们更多的思考。@Dinesh:我可以——尽管我从来没有像代码那样深入,而且它是特定领域的。我已经找到了问题所在。。。我将发布一个答案。