2016-11-22 6 views
2

Я написал программу, которая вызывается внешним DLL-методом от устройства-производителя. Эти методы (около 600) делают подключение Ethernet к устройству. Методы выглядит следующим образом:C# NUnit Test: выкрой внешний DLL-метод, который вызывает соединение сокета с внешним устройством.

[DllImport("Libary.dll", EntryPoint = "methode1")] 
public static extern short methode1(ushort Handl, 
    short a, short b, short c, short d, [Out, MarshalAs(UnmanagedType.LPStruct)] SpecialStruct1 e); 

и это:

[DllImport("Libary.dll", EntryPoint = "methode2")] 
public static extern short methode2(ushort Handl, short a, int b); 

Теперь я хочу написать модульное тестирование для моего кода и хочу высмеивать DLL-методу. DLL написана на C и с библиотекой появился файл C# (см. Вышеприведенные методы). Мои методы выглядит следующим образом:

public int myMethode1(ushort handl, List<object> parameters) 
{ 
    int a = (int)parameters[1]; 
    string b = (string)parameters[2]; 
    return Libary1.Methode1(handl, ref a, b); 
} 

Можете ли вы сказать мне, как написать Пробный für этот внешний DLL? Как я могу проверить свои методы без устройства? Инструменты ведьмы могут мне помочь?

+0

Пробовали ли вы какие-нибудь издевательские рамки? Если да, просмотрите этот http://stackoverflow.com/questions/20400734/c-sharp-how-do-i-mock-a-class-without-an-interface. На выбор можно найти множество фальшивых фреймворков. Вот достойный список. Http://nugetmusthaves.com/Tag/mocking. – Vinod

+2

Проанализируйте вызовы методов dll за интерфейсом, чтобы их можно было издеваться. – Nkosi

ответ

2

Thaks к @Nkosi Я сделал интерфейс:

public interface ILibary 
{ 
    short Methode1(ushort FlibHndl, [Out, MarshalAs(UnmanagedType.LPStruct)] RealLibary.Struct1 a); 
} 

и класса, которые, которые называют статические методы и реализует интерфейс:

class Libary: ILibary 
{ 
    public short Methode1 (ushort FlibHndl, [Out, MarshalAs(UnmanagedType.LPStruct)] RealLibary.Struct1 a) 
    { 
     return RealLibary.Methode1(FlibHndl, a); 
    } 
} 

и тест вроде этого:

[Test] 
    public void Libary1_Methode1_struct() 
    { 
     Speed speed = new Speed(new CommInterface()); 
     int response = 99; 
     Mock<ILibary> mockLibary = new Mock< ILibary>(); 

     mockLibary.Setup(
      r => 
       r. Methode1(It.IsAny<ushort>(), It.IsAny<short>(), It.IsAny<short>(), It.IsAny<RealLibary.Struct1>())) 
      .Callback<ushort, short, short, RealLibary.Struct1>(
       (hndl, a, b, dbaxis) => 
       { 
        dbaxis.data = new[] {0, 1, 2, 3}; 
        dbaxis.dummy = 0; 
        dbaxis.type = 0; 
       }); 

     RealLibary.Struct1 struct1 = new RealLibary.Struct1(); 
     List<object> list = new List<object>(); 
     list.Add(new short()); 
     list.Add(struct1); 
     list.Add(new short()); 
     list.Add(new short()); 
     speed.Methode1(0, mockLibary.Object, list, out response); 

     Assert.AreEqual(4, struct1.data.Length); 
    } 

Так оно и работает! Я надеюсь, что все правильно

+0

Да. это именно то, что я предлагал. Хорошая работа. – Nkosi