Rhino Mocks,AssertWasCall与Arg约束

时间:2012-01-27 15:51:18

标签: rhino-mocks

我创建了一个模拟的界面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定义的。关于测试有什么问题的任何想法?

1 个答案:

答案 0 :(得分:3)

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

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