.net - Rhino 模拟错误 : Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw

标签 .net unit-testing c#-4.0 rhino-mocks

我有以下测试代码:

parentViewModel = MockRepository.GenerateMock<IParentViewModel>();
parentViewModel.Expect(x => x.GetPropertyValue<IEnumerable<Milestone>>("JobMilestones")).Return(new Milestone[0]);

viewModel = new JobPenaltiesViewModel(j, new Penalty[0], _opContext, parentViewModel);

Assert.That(viewModel.Milestones.Count(), Is.EqualTo(0));
parentViewModel.VerifyAllExpectations();

List<string> propsChanged = new List<string>();
viewModel.PropertyChanged += (s, e) => propsChanged.Add(e.PropertyName);

parentViewModel.Raise(x => x.PropertyChanged += null, parentViewModel, new PropertyChangedEventArgs("JobMilestones"));

AssertPropertiesChangedAsExepected(propsChanged, 1, "Milestones");

Milestone m1 = GenerateMilestone(j);
List<Milestone> milestones1 = new List<Milestone> { m1 };
parentViewModel.Expect(x => x.GetPropertyValue<IEnumerable<Milestone>>("JobMilestones")).Return(milestones1).Repeat.Any();

IEnumerable<Milestone> milestones = viewModel.Milestones;
Assert.That(milestones.Count(), Is.EqualTo(1));
parentViewModel.VerifyAllExpectations();

所有测试和断言都成功,直到:
Assert.That(milestones.Count(), Is.EqualTo(1));

这就是我得到异常的地方:
Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw.

我已经尝试了我能想到的所有方法,我的测试似乎表明 parentViewModel Mock 正在返回 null 或空枚举(即,当我使用调试器检查返回值时,“结果 View ”表示枚举返回没有结果)。

我在这里缺少什么?

最佳答案

milestones.Count()像这样执行(因为这是一个 IEnumerable 对象):

  • 将计数器设置为 0。
  • 获取第一个元素。
  • 将 1 添加到计数器。
  • 移动到下一个元素。
  • 步骤 3 直到下一个元素为空
  • 返回计数器

  • 所以我建议你改写一些。

    选项1:
  • 创建的不是 IEnumerable 集合,而是一些更强的对象,比如 ListArray :
    var milestones = viewModel.Milestones.ToArray();
    //var milestones = viewModel.Milestones.ToList();

    之后就可以分别使用CountLength Assert 的属性(property)查看:
    Assert.That(milestones.Count, Is.EqualTo(1));
    //Assert.That(milestones.Length, Is.EqualTo(1));
  • 创建一个局部变量来存储计数参数:
    var count = viewModel.Milestones.Count(); // .Count() method executes here. Assert.That(count, Is.EqualTo(1));
  • 关于.net - Rhino 模拟错误 : Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6279989/

    相关文章:

    java - 如何寻找没有断言的 JUnit 和 TestNG 测试?

    javascript - 使用 Jest 导入 mp4 文件时出错

    Python Selenium 在一个浏览器实例中运行多个测试?

    string - 在 C# 中替换文件名的一部分

    c# - 如何在 c# 上将 asp.net 用户控件的当前类名转换为字符串?

    c# - 为什么隐藏字段值没有发布在 mvc 4 中?

    .net - Html Agility Pack 返回无效的 XPath

    c# - 是否有一种内置的方法来比较 IEnumerable<T> (通过它们的元素)?

    c# - 在 GeckoWebBrowser 中检索选定的文本

    asp.net-mvc-3 - Dapper 使用存储过程 (MSSQL) 时的缓存解决方案