首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rhino模拟列表约束

Rhino模拟列表约束
EN

Stack Overflow用户
提问于 2011-09-23 02:25:59
回答 2查看 4K关注 0票数 7

我正在尝试断言存根上调用了一个方法。我试图断言的方法是takes an IEnumerable<string>。我不关心确切的内容,但我只想测试计数是否为某个特定的数字。我不能得到正确的断言,我知道

代码语言:javascript
复制
Rhino.Mocks.Exceptions.ExpectationViolationException : Bob.DoThings(collection count equal to 10); Expected #1, Actual #0.

我知道DoThings()确实正在被调用...我就是不能把约束弄对..

代码语言:javascript
复制
var myBob= MockRepository.GenerateStub<Bob>();
var countConstraint =   Rhino.Mocks.Constraints.List.Count(Rhino.Mocks.Constraints.Is.Equal(10));

// execution code....
Joe myJoe = new Joe(myBob);
myJoe.MethodThatShouldCallDoThingWith10();

myBob.AssertWasCalled(s => s.DoThings(null), o => Constraints(countConstraint));

我还尝试添加"IgnoreArguments“作为约束。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-23 19:33:25

这里的问题是延迟执行。直到枚举了IEnumerable<string>,项目列表才会被“构建”。由于Rhino.Mocks只记录被调用的内容,所以它从不“使用”方法参数,因此,从不构建或枚举该列表。正如您所看到的,添加ToList()或ToArray()将枚举和构建列表,因此如果您使用这些方法之一,测试将会通过。

一种解决方法是获取传递给该方法的列表,并对其进行检查:

代码语言:javascript
复制
var list = (IEnumerable<int>) myBob.GetArgumentsForCallsMadeOn(b => b.DoThings(null))[0][0];
Assert.AreEqual(10, list.Count());

此测试通过,不需要对您的代码进行任何更改。

票数 11
EN

Stack Overflow用户

发布于 2011-09-23 03:19:42

这个问题已经被Here报告过了。我已经能够用下面的Bob和Joe重现这个问题:

代码语言:javascript
复制
public interface Bob
{ void DoThings(IEnumrable<int> list); }

public class Joe
{
    private readonly Bob bob;

    public Joe(Bob bob)
    { this.bob = bob; }

    public void MethodThatShouldCallDoThingWith10()
    { 
          var values = Enumerable.Range(1, 100).Where(x => x > 0 && x < 11);
          bob.DoThings(values); 
    }
}

看起来Rhino Mock毕竟有一些问题,当涉及到LINQ时:要么将错误报告给Ayende,要么在您的生产代码中添加ToList() (实际上并不推荐)……

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7519607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档