簡體   English   中英

單元測試/模擬XML-RPC.net調用

[英]Unit testing / mocking XML-RPC.net calls

我正在開發使用CookComputing XML-RPC.net的應用程序

我的問題是如何對調用外部rpc方法的方法進行單元測試。

如果我們以網站上的示例為例:

//This is the XML rpc Proxy interface
[XmlRpcUrl("http://www.cookcomputing.com/xmlrpcsamples/RPC2.ashx")]
public interface IStateName : IXmlRpcProxy
{
    [XmlRpcMethod("examples.getStateName")]
    string GetStateName(int stateNumber); 
}


public class MyStateNameService 
{
    public string GetStateName(int stateNumber)
{
        IStateName proxy = XmlRpcProxyGen.Create<IStateName>();
        return proxy.GetStateName(stateNumber);
     }
}

我們如何才能有效地測試IStateName的結果,而無需實際訪問http://www.cookcomputing.com/xmlrpcsamples/RPC2.ashx

我想一個好的開始是在MyStateNameService上使用MyStateNameService的構造函數,並在IStateName上傳遞假的(或嘲笑的)實例。

我有興趣測試它的實際內容-例如偽造端點的響應,並以某種方式返回,而不僅僅是驗證GetStateName調用了服務...

編輯

我不是在嘗試測試服務的內容 ,而是我的班級將對此做些什么。

例如,假設響應為:

<?xml version="1.0"?>
<methodResponse>
  <params>
    <param>
        <value><string>My State Name</string></value>
    </param>
  </params>
</methodResponse>

我想“假”該響應一些如何測試MyStateNameService.GetStateName實際上返回了“我的州名”

您的問題出在這里應用的Singleton模式。

XmlRpcProxyGen.Create<IStateName>();

因此,使用依賴注入(按構造函數)的想法是一個好的開始。 (您是否使用IoC容器?)

接下來是為IStateName服務創建一個Mock / Fake / Stub。 這可以通過許多方式來實現。

使用動態模擬系統可以為您節省一些工作,但是您需要了解它們的用法。

使用NUnit,NSubstitute和修改后的MyStateNameService經典AAA測試示例:

class MyStateNameService
{
  private readonly IStateName _remoteService;
  public MyStateNameService(IStateName remoteService)
  {
    // We use ctor injection to denote the mandatory dependency on a IStateName service
    _remoteService = remoteService;
  }

  public string GetStateName(int stateNumber)
  {
    if(stateNumber < 0) throw new ArgumentException("stateNumber");
    // Do not use singletons, prefer injection of dependencies (may be IoC Container)
    //IStateName proxy = XmlRpcProxyGen.Create<IStateName>();
    return _remoteService.GetStateName(stateNumber);
  }
}

[TestFixture] class MyStateNameServiceTests
{
  [Test]
  public void SomeTesting()
  {
    // Arrange
    var mockService = Substitute.For<IStateName>();
    mockService.GetStateName(0).Returns("state1");
    mockService.GetStateName(1).Returns("state2");

    var testSubject = new MyStateNameService(mockService);


    // Act
    var result = testSubject.GetStateName(0);

    // Assert
    Assert.AreEqual("state1", result);

    // Act
    result = testSubject.GetStateName(1);

    // Assert
    Assert.AreEqual("state2", result);

    // Act/Assert
    Assert.Throws<ArgumentException>(() => testSubject.GetStateName(-1));
    mockService.DidNotReceive().GetStateName(-1);

    /* 
       MyStateNameService does not do much things to test, so this is rather trivial.
       Also different use cases of the testSubject should be their own tests ;) 
    */


  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM