【问题标题】:Rhino Mock List constraintRhino 模拟列表约束
【发布时间】:2011-11-23 02:13:24
【问题描述】:

我试图断言在存根上调用了一个方法。我试图断言的方法被称为IEnumerable<string>。我不关心确切的内容,但我只想测试计数是否是某个数字。我无法正确断言,我明白了

Rhino.Mocks.Exceptions.ExpectationViolationException : Bob.DoThings(collection count equal to 10); Expected #1, Actual #0.

我知道 DoThings() 确实被调用了......我只是无法让约束正确......

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”作为约束。我错过了什么?

【问题讨论】:

    标签: c# unit-testing list rhino-mocks


    【解决方案1】:

    这里的问题是延迟执行。直到IEnumerable&lt;string&gt; 被枚举,项目列表才被“构建”。由于 Rhino.Mocks 只记录被调用的内容,它从不“使用”方法参数,因此从不构建或枚举列表。如您所见,添加 ToList() 或 ToArray() 会枚举并构建列表,因此如果您使用其中一种方法,测试将通过。

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

    var list = (IEnumerable<int>) myBob.GetArgumentsForCallsMadeOn(b => b.DoThings(null))[0][0];
    Assert.AreEqual(10, list.Count());
    

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

    【讨论】:

    • Patrick,我不知道 GetArgumentsForCallsMadeOn() 方法。我能够在这里写一个有意义的断言。最近似乎经常出现延迟执行问题。谢谢。
    【解决方案2】:

    Here 已报告此问题。我已经能够使用以下 Bob 和 Joe 重现此问题:

    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); 
        }
    }
    

    在 LINQ 方面,Rhino Mocks 似乎存在一些问题:要么向Ayende 报告错误,要么在生产代码中添加 ToList()(不推荐)...

    【讨论】:

    • 我很奇怪...如果我在 MethodThatShouldCallDoThingWith10 中放置一个断点,我可以看到 bob 实例是一个代理,并且正在调用。显然,这不是我的真实代码,但是,是的,我认为我的结果有些问题,但我不能指望它
    • 你可以开始简单化它了... Bob 是一个接口吗?抽象类?带虚方法的类?
    • 我是一个带有泛型的接口......一个 Bob。我想知道被测单元是用 WhereSelectIterator 调用 MethodThatShouldCallDoThingWith10,而不是像 List 或简单的 IEnumerable 这样更基本的东西。我在想 Count 约束不是那么宽容?
    • DoThings 采用 IEnumarble 吗?也许它没有准确地传递 10 个项目?
    • 它传递了 10,但作为 WhereSelectIterator 传递
    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多