【问题标题】:Rhino Mocks, AssertWasCalled with Arg constraintsRhino Mocks,带有 Arg 约束的 AssertWasCalled
【发布时间】:2012-01-27 15:51:18
【问题描述】:

我创建了一个模拟接口 IManager。有方法

void LogUserWithParams(string maskValue, E_LOG_LEVEL logLevel, 
string formatMsg, ref Array args);

我创建了一个测试来检查是否使用任何参数调用该方法。

Array logParams = Arg<Array>.Ref(Is.Anything(), new object[0]).Dummy;
manager.AssertWasCalled(man => man.LogUserWithParams(
    Arg<string>.Is.Anything, 
    Arg<E_LOG_LEVEL>.Is.Anything,
    Arg<string>.Is.Anything, 
    ref logParams
    )
);

它产生了一条很奇怪的信息: 必须使用以下方式定义参数 0:Arg.Is、Arg.Text 或 Arg.List

如您所见,所有参数都是使用 Arg 定义的。知道测试出了什么问题吗?

【问题讨论】:

    标签: rhino-mocks


    【解决方案1】:

    按照您的方式(使用预定义变量)调用它会导致抛出异常。这就是诀窍:

    manager.AssertWasCalled(man => man.LogUserWithParams(
        Arg<string>.Is.Anything, 
        Arg<E_LOG_LEVEL>.Is.Anything,
        Arg<string>.Is.Anything, 
        ref Arg<Array>.Ref(Is.Anything(), new object[0]).Dummy
    ));
    

    编辑:

    我对这个简单的程序进行了实验,一切似乎都按预期工作:

    public interface ILogger
    {
        void LogUserWithParams(string maskValue, ref Array args);
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var loggerMock = MockRepository.GenerateMock<ILogger>();
            loggerMock.Expect(l => l.LogUserWithParams(
                Arg<string>.Is.Anything,
                ref Arg<Array>.Ref(Is.Anything(), new object[0]).Dummy
            ));
    
            Array output = new Array();
            loggerMock.LogUserWithParams("[a-z]", ref output);
            loggerMock.VerifyAllExpectations();
    
            Console.WriteLine("Done...");
            Console.ReadLine();
        }
    }
    

    【讨论】:

    • 谢谢,吉米!很奇怪,您的变体导致了另一个神秘的错误: 参数 3 必须定义为: out Arg.Out(returnvalue).Dummy 因此,我不得不将最后一个参数更改为 ref Arg.Out(new object[ 0]).Dummy 作为一种解决方法很好,但没有给我任何方法来定义这个参数的进一步约束。
    • @IvanGerken:这确实很奇怪。你能试试我的样品是否适合你吗?另外,您使用的是什么版本的 Rhino(这里是 3.6)?
    • 我用我在项目中使用的相同版本的 Rhino Mocks 3.6 尝试了您的示例,并且效果很好。我只需要更改一行:“Array output = new Array();”到“数组输出=新对象[0];”。我想知道你是如何设法建立你的样本的 :) 好吧,我可能偶然发现了一些难以重现的 RM 故障。在我的测试中,我模拟了几乎十几个来自 PIA 的接口。再次感谢您的帮助!
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多