我有以下测试代码:
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或空枚举(即当我使用调试器检查返回值时'结果视图'表示枚举没有返回结果)。
我在这里缺少什么?
答案 0 :(得分:2)
milestones.Count()
正在执行(因为这是一个IEnumerable对象):
所以我建议你重写一下。
选项1:
创建非IEnumerable集合,但创建一些更强大的对象,例如List
或Array
:
var milestones = viewModel.Milestones.ToArray();
//var milestones = viewModel.Milestones.ToList();
之后,您可以分别使用Count
和Length
属性进行Assert
检查:
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));
答案 1 :(得分:0)
我删除了有问题的代码;但是我从来没有弄明白为什么它的表现如此。