单元测试Silverlight模拟WCF客户端

时间:2011-06-15 14:27:02

标签: silverlight wcf unit-testing mocking

我有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() 
{
     ...

但基础构造函数会导致各种问题,我不想在测试项目中添加其他服务引用。

我错过了一个技巧,这可以在没有任何第三方模拟工具的情况下完成吗?

2 个答案:

答案 0 :(得分:1)

我建议您在类的构造函数中指定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。例如,假设您的自动生成的客户端在命名空间MyClient中被称为MyNamespace,则您的部分类需要如下所示:

namespace MyNamespace
{
    public partial class MyClient : IMyClientInterface
    {

    }
}

假设生成的MyClient包含IMyClientInterface上的所有成员,则不需要进一步的代码,您可以在IMyClientInterface

的实例上构建您的类

答案 1 :(得分:0)

您可以创建一个您选择的界面,然后创建与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();
    }
}