2012-02-15 15 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'方式グループが異なる(同じ参照しない)一あなたのコードで呼び出されます。 –

+0

ありがとう!私はコードを変更し、 'restExecution'のためにもう一つのInterfaceを実装しました。メソッドが参照を等しくすることを期待しました - ビットはまだテストに合格しません。 – DIF

+0

'IDataAccessApi'インタフェースはどのようにして定義されていますか、具体的には' Request 'メソッドのシグニチャは何ですか? –

答えて

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

関連する問題