Юнит-тестирование действия с NUnit - PullRequest
0 голосов
/ 15 февраля 2012

Я хотел бы протестировать следующую функцию с помощью NUnit и Rhino Mocks.Функция использует заданные параметры для создания RestSharp.RestRequest и передачи запроса dataAccessApi:

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")), но не с Action new RestExecution().Get- как мне выполнить юнит-тестирование таких вызовов?

Заранее благодарю за помощь!

Редактировать: Изменен код в отношении комментария @ rich.okelly.

Редактировать: Добавлен код для интерфейсов

1 Ответ

1 голос
/ 15 февраля 2012

Попробуйте следующее:

// 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)
    )
);
...