【问题标题】:How to set up NUnit Mock Object for IGrouping如何为 IGrouping 设置 NUnit 模拟对象
【发布时间】:2009-01-14 04:59:11
【问题描述】:
public myReturnObj MethodA(System.Linq.IGrouping<string, MyObject> group){
...
foreach (MyObject o in group)
{
//business process
}
...
return myReturnObj; }
我想设置 NUnit Mock 对象作为参数传递,然后
在我的单元测试中检查 MethodA 的结果。
如何模拟这个 IGrouping?
【问题讨论】:
标签:
c#
unit-testing
nunit
mocking
【解决方案1】:
您可以像模拟任何界面一样模拟 IGrouping(string, MyObject) 吗?
DynamicMock myMockGrouping = new DynamicMock(typeof IGrouping<string, MyObject>);
或者,您可以选择更实时的版本:
List<MyObject> inputs = GetInputs();
IGrouping<string, MyObject> myLiveGrouping = inputs
.GroupBy(o => "somestring").First();
【解决方案2】:
我对模拟对象很陌生。第一次在我脑海中尝试实例化
一个 DynamicMock() 对象,然后继续它的 ExpectAndReturn() 方法。
对于 IGrouping 接口,只有一个属性 Key。所以如果我想设置ExpectAndReturn让它在foreach中工作,也许我得去实现IEnumerator的Current、Next()、Reset()。
这样设置模拟对象并不容易,浪费了大量的开发时间。
现在我的解决方案是这样的:
//prepare expected list of objects that want to be tested
List<MyObject> list = new List<MyObject>();
list.Add(new MyObject() {BookingNo="111",...});
list.Add(new MyObject() {BookingNo="111",...});
// grouping objects in list
IEnumberable<IGrouping<string, MyObject>> group = list.GroupBy(p => p.BookingNo);
//in my test method
myReturnObj obj = MethodA(group.First());
Assert.xx(...);
非常感谢大卫 B!