[英]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.