1

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);
     }
}

実際にhttp://www.cookcomputing.com/xmlrpcsamples/RPC2.ashxにアクセスせずに IStateName の結果を効果的にテストするにはどうすればよいですか

MyStateNameServiceIStateName を取得し、IStateName の偽の (またはモックされた?) インスタンスを渡すコンストラクターが良いスタートになると思います...

実際のコンテンツについてテストすることに興味があります-たとえば、エンドポイントからの応答を偽造しGetStateName、サービスを呼び出すことを確認するだけでなく、何らかの形でそれを返します...

編集

私は サービスの内容をそのままテストしようとしいるわけではありません。

たとえば、応答が次のようになるとします。

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

MyStateNameService.GetStateName実際に「My State Name」を返したことをテストする方法をいくつかテストするために、その応答を「偽造」したいと思います

4

1 に答える 1

0

問題は、ここで適用されるシングルトン パターンにあります。

XmlRpcProxyGen.Create<IStateName>();

したがって、依存性注入 (コンストラクターによる) を使用するというあなたのアイデアは良いスタートです。(IoC コンテナーを使用しますか?)

次に、IStateNameサービスのモック/フェイク/スタブを作成します。これは多くの方法で実現できます。

動的モッキング システムを使用すると、多少の作業を節約できますが、その使用法を学ぶ必要があります。

NUnit、NSubstitute、および変更された を使用するための従来の AAA テストの例MyStateNameService:

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


  }

}
于 2013-01-11T14:36:03.560 に答える