【问题标题】:Unit-Testing an Action with NUnit使用 NUnit 对动作进行单元测试
【发布时间】:2012-02-15 12:33:07
【问题描述】:

我想用 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")),但不适用于操作new RestExecution().Get - 我如何对此类调用进行单元测试?

提前感谢您的帮助!

编辑:更改了关于@rich.okelly 评论的代码。

编辑:添加接口代码

【问题讨论】:

  • 在断言中传递的RestExecution.Get 方法组与代码中调用的方法组不同(不等于引用)。
  • 谢谢!我更改了代码,为restExecution 实现了另一个接口,希望这些方法的引用相等——它仍然无法通过测试。
  • IDataAccessApi 接口是如何定义的,更具体地说,Request&lt;T&gt; 方法的签名是什么?
  • 我添加了IDataAccessApiIRestExecution-Interface 的源代码。我发现的另一点是:request 也不是引用相等吗?

标签: c# unit-testing nunit rhino-mocks restsharp


【解决方案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)
    )
);

【讨论】:

  • 谢谢!代码运行良好,方法通过测试!
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 2011-02-20
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多