2012-01-27 114 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