Модульное тестирование насмешливого клиента WCF Silverlight - PullRequest
0 голосов
/ 15 июня 2011

У меня есть 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 ]

1 голос
/ 15 июня 2011

Я бы посоветовал вам указать экземпляр 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

0 голосов
/ 16 июня 2011

Вы можете создать интерфейс по вашему выбору, а затем создать и адаптировать оболочку, которая взаимодействует с 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...