2012-02-15 51 views
0

我想用NUnit和Rhino Mocks對以下函數進行單元測試。該函數使用給定的參數來創建一個RestSharp.RestRequest並給請求dataAccessApi用NUnit測試一個動作

public void CopyToUserSession(string uri, string sourcePath) 
{ 
    RestRequest request = new RestRequest(uri, Method.POST); 
    request.AddParameter("source-path", sourcePath); 

    dataAccessApi.Request<object>(request, restExecution.Get); 
} 

這是測試類:

public void CopyToUserSession_ValidUriAndParameter_CallDataAccessRequest() 
{ 
    // Arrange 
    var dataAccessApi = MockRepository.GenerateMock<IDataAccessApi>(); 
    var restExecution = MockRepository.GenerateMock<IRestExecution>(); 
    var sinkNodeResource = new SinkNodeResource(dataAccessApi, restExecution); 

    string uri = "http://SomeUri.com"; 
    string sourcePath = "Some Source Path"; 

    RestRequest request = new RestRequest(uri, Method.POST); 
    request.AddParameter("source-path", sourcePath); 

    // Act 
    sinkNodeResource.CopyToUserSession(uri, sourcePath); 

    // Assert 
    dataAccessApi.AssertWasCalled(x => x.Request<object>(request, restExecution.Get)); 
} 

的IDataAccessApi ...:

public interface IDataAccessApi 
{ 
    void Request<T>(RestRequest request, Action<T> callbackAction) where T : new(); 
} 

...和IRestExecution:

public interface IRestExecution 
{ 
    void Get(object o); 

    void Put(object o); 

    void Post(object o); 

    void Delete(object o); 
} 

測試使用更簡單的函數調用(如x.Test("Some String")),但不與操作new RestExecution().Get - 我如何對這些調用進行單元測試?

非常感謝您的幫助!

編輯:更改了關於@ rich.okelly評論的代碼。

編輯:添加的接口代碼

+1

在斷言中傳遞的'RestExecution.Get'方法組是不同的(不參考相等)向所述一個在你的代碼中調用。 – 2012-02-15 12:39:08

+0

謝謝!我改變了代碼,爲'restExecution'實現了另一個接口,希望這些方法能夠引用相同 - 它仍然不會通過測試。 – DIF 2012-02-15 12:51:03

+0

「IDataAccessApi」接口是如何定義的,更具體地說是「請求」方法的簽名是什麼? – 2012-02-15 12:52:37

回答

1

嘗試以下方法:

// arrange 
var dataAccessApi = MockRepository.GenerateMock<IDataAccessApi>(); 
var restExecution = MockRepository.GenerateMock<IRestExecution>(); 
var sinkNodeResource = new SinkNodeResource(dataAccessApi, restExecution); 
string uri = "http://SomeUri.com"; 
string sourcePath = "Some Source Path"; 

// act 
sinkNodeResource.CopyToUserSession(uri, sourcePath); 

// assert 
dataAccessApi.AssertWasCalled(
    x => x.Request<object>(
     Arg<RestRequest>.Matches(
      y => y.Method == Method.POST && 
       y.Resource == uri && 
       y.Parameters.Count == 1 && 
       y.Parameters[0].Value as string == sourcePath 
     ), 
     Arg<Action<object>>.Is.Equal((Action<object>)restExecution.Get) 
    ) 
); 
+0

謝謝!代碼工作正常,該方法通過測試! – DIF 2012-02-15 13:08:03