繁体   English   中英

单元测试Silverlight模拟WCF客户端

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM