2015-10-03 2 views
1

Я использую некоторую библиотеку COM в своем C#, которая привязана к определенному оборудованию и не работает без него. На компьютере разработки/тестирования у меня нет такого оборудования. Метод, который использует библиотеку выглядит следующим образом:Могу ли я высмеивать объект, который невозможно создать?

using HWSysManagerLib; 
bool ProcessBias(HWSysManager systemManager, string hwPath) 
{ 
    int handle = systemManager.OpenConfiguration(hwPath); 
    ... 
    // some magic goes here 
    // return result 
} 

вопрос, я могу издеваться HWSysManager для метода испытаний и как? Существует несколько методов только в HWSysManager, и было бы нецелесообразно имитировать их функциональность для тестирования. Крошечный пример был бы замечательным в том, как издеваться над этим, если это вообще возможно.

ответ

5

Вы можете использовать шаблон адаптера здесь.

Создать интерфейс с именем IHWSysManager

public interface IHWSysManager 
{ 
    int OpenConfiguration(string hwPath); 
} 

Реальный класс реализации только делегирует работа в библиотеке:

public class HWSysManagerImpl : IHWSysManager 
{ 
    private HWSysManager _hwSysManager; //Initialize from constructor 

    public int OpenConfiguration(string hwPath) 
    { 
     return _hwSysManager.openConfiguration(hwPath); 
    } 
} 

Использование интерфейса в коде следующим образом:

bool ProcessBias(IHWSysManager systemManager, string hwPath) 
{ 
    int handle = systemManager.OpenConfiguration(hwPath); 
    ... 
    // some magic goes here 
    // return result 
} 

Теперь вы можете издеваться над своим интерфейсом IHWSysManager с mo ck или вы можете создать класс заглушки самостоятельно.

+0

Так что это неизбежно изменить мое приложение. Хотя, как я называю 'ProcessBias' из моего приложения? Прямо сейчас я называю это следующим: 'HWSysManager sm = new HWSysManager(); ProcessBias (sm, ""); ' – Pablo

+0

В основном я должен реализовать все делегаты методов, которые я использовал из этой библиотеки. – Pablo

+0

Вы не должны создавать экземпляр в вызывающем методе. Вместо этого возьмите IHWSysManager из конструктора. В вашей машине разработки задайте класс stub как параметр, а в реальной среде - реальный класс реализации. Этот метод называется Injection Dependency, вы можете прочитать об этом [здесь] (http://stackoverflow.com/questions/130794/what-is-dependency-injection). –

-1

Предположим, вы должны создать класс HWSysManager (или какое-то другое имя) в своих случаях Mock, добавить туда какие-то нужные методы, а затем издеваться над ними. Например:

class HWSysManager 
    { 
     public virtual int ExampleReturnIntMethod(int a) 
     { 
      var someInt = 0; 
      return someInt; 
     } 

, а затем установка:

public void TestMethod() 
    { 
     Mock<HWSysManager> hwSysManager = new Mock<HWSysManager>(); 
     hwSysManager.Setup(x => x.ExampleReturnInMethod(It.IsAny<int>())).Returns(10); //if parameter is any of int, return 10 in this case 
    } 

Затем использовать Передразнивало объект просто использовать свойство 'объекта':

var hwSysInstance = hwSysManager.Object; 
var result = hwSysInstance.ExampleReturnInMethod(2); //result will be 10 in this case - as we have mocked 

В случае выше ваших методов/свойств имеют быть виртуальным.

Вы можете использовать интерфейсы также, в вашем случае:

public interface HwsysManager 
    { 
     int OpenConfiguration(string hwPath); 
    } 

    public void TestMethod() 
    { 
     Mock<HwsysManager> hwsysManager = new Mock<HwsysManager>(); 

     hwsysManager.Setup(x => x.OpenConfiguration(It.IsAny<string>())).Returns(10); 
    } 

Все функции этой библиотеки Mock описаны здесь: https://github.com/Moq/moq4/wiki/Quickstart

+0

На самом деле мне нужно протестировать метод, который использует 'HWSysManager'.Поэтому, если я последую вашему предложению, у меня возникла ошибка типа: невозможно преобразовать из 'Moq.Mock ' в 'HWSysManagerLib.HWSysManager'. В TestMethod у меня есть 'bool b = ClientProgram.ProcessBias (tcsm)'. 'tcsm - макет объекта. Поэтому я подозреваю, что здесь невозможно обмануть? – Pablo

+0

так что tcsm на самом деле есть tcsm.Object, но все тот же ошибка. – Pablo

+0

Кроме того, у меня есть ошибка в TestClass, что сборка, определяющая 'HWSysManagerLib.HWSysManager', не ссылается. – Pablo

1

Вы можете использовать Typemock Isolator для подделки HWSysManager.

Для примера, вы можете сделать следующее:

var fakeManager = Isolate.Fake.Instance<HWSysManager>(); 

Isolate.WhenCalled(() => fakeManager.OpenConfiguration("")).WillReturn(0); 

И потом, вы можете передать этот подделать менеджер ProcessBias(IHWSysManager systemManager, string hwPath) в качестве аргумента.

Как вы сказали, вы можете моделировать несколько методов из IHWSysManager. Итак, мне совет, чтобы настроить поведение методов этого менеджера, используя DoInstead():

Isolate.WhenCalled(() => fakeManager.OpenConfiguration("")).DoInstead(
    context => 
    { 
     //Your simulation 
    }); 

Вы можете посмотреть here для получения дополнительной информации. Я думаю, это может быть очень полезно для вас.

Смежные вопросы