2012-01-27 126 views
1

这里有我创建一个模拟的接口IManager。它具有方法犀牛嘲笑,AssertWasCalled与Arg限制

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

正如你可以看到,所有的参数都是用精氨酸定义。对测试有什么问题有任何想法?

回答

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

谢谢,吉米!奇怪的是,你的变种造成的另一个神秘的错误: 参数3必须被定义为:出精氨酸 .OUT(返回值).Dummy 因此,我不得不在最后一个参数更改为 裁判精氨酸 .OUT(新对象[0])。虚拟 这很好,但没有给我任何方法来定义这个参数的进一步限制。 – 2012-01-30 09:26:45

+0

@IvanGerken:确实很奇怪。你可以试试我的样品是否适合你?此外,你使用的是什么版本的Rhino(3.6这里)? – 2012-01-30 18:21:25

+0

我试着用我的项目中使用的相同版本的Rhino Mocks 3.6的样本,它工作正常。我不得不只改变一行:“Array output = new Array();”到“数组输出=新对象[0];”。我不知道你是如何设法建立你的样本:) 好吧,可能我偶然发现了一些几乎不可复制的RM故障。在我的测试中,我模拟了几十个来自PIA的接口。再次感谢你的帮助! – 2012-01-31 09:18:59