[英]Unit testing Silverlight mocking WCF client
我有SL代码
public void LoadData()
{
MyClient myClient = new MyClient();
myClient.MyMethodCompleted += new EventHandler<MyMethodCompletedEventArgs>(myMethod_MyMethodCompleted);
myClient.MyMethodAsync();
}
然后完成的方法将根据服务器返回的内容设置属性。
效果很好,但是我想对类进行单元测试,并且属性都是私有的。 我希望做一些类似的事情
public void LoadData(IMyClient myClient = null)
{
if(myClient == null) {
MyClient myClient = new MyClient();
}
...
并传递一个模拟,但是客户端的接口不包含异步方法,而仅包含原始服务器端非异步方法,即public ReturnType MyMethod();。
所以我尝试使用MyClient作为Mock对象的基类
public MyMockClient : MyClient
new public ReturnType MyMethod()
{
...
但是基本构造函数会导致各种问题,因此我不想向测试项目添加其他服务引用。
我是否错过了一个窍门,可以在没有任何第三方模拟工具的情况下完成此操作吗?
我建议您在类的构造函数中指定MyClient
实例:
public class MyClass
{
private MyClient _client;
public MyClass()
: this(new MyClient())
{ }
public MyClass(MyClient client)
{
_client = client;
_client.MyMethodCompleted += ...
}
public void LoadData
{
_client.MyMethodAsync();
}
}
然后,您可以继承MyClient的子类(或者更好的是,重构它以实现接口)来实现客户端的模拟版本。
响应评论为了在自动生成的WCF客户端类上实现接口,可以使用Partial Classes 。 例如,假设自动生成的客户端在名称空间MyNamespace
称为MyClient
,则您的部分类将需要如下所示:
namespace MyNamespace
{
public partial class MyClient : IMyClientInterface
{
}
}
假设生成的MyClient
包含IMyClientInterface
上的所有成员,则不需要进一步的代码,您可以在IMyClientInterface
的实例上构造您的类
您可以创建自己选择的接口,然后创建与MyClient对话的适配器包装,如下所示:
public interface IClient
{
void Foo();
int Bar();
}
public class MyClientAdapter : IClient
{
private MyClient Client { get; set; }
public MyClientAdapter(MyClient client)
{
Client = client
}
public void Foo()
{
Client.Foo();
}
public int Bar()
{
return Client.Bar();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.