2010-03-09 2 views
2

Это кажется довольно простой проблемой, но я не могу найти ключевые слова для выполнения моих поисков.moqing static method call to C# library class

Я пытаюсь выполнить тестирование, издеваясь над всеми объектами в этом вызове метода. Я могу сделать так, чтобы все мои собственные творения для этого, кроме одного:

public void MyFunc(MyVarClass myVar) 
{ 
    Image picture; 
    ... 

    picture = Image.FromStream(new MemoryStream(myVar.ImageStream)); 

    ... 
} 

FromStream статический вызов из класса Image (часть C#). Итак, как я могу реорганизовать свой код, чтобы издеваться над этим, потому что я действительно не хочу предоставлять поток изображений для модульного теста.

ответ

1

Вы можете обернуть статическую функцию в свойство типа Func, которое может быть установлено модульным тестом с помощью макета или заглушки.

public class MyClass 
{ 
    .. 

    public Func<Image, MemoryStream> ImageFromStream = 
            (stream) => Image.FromStream(stream); 


    public void MyFunc(MyVarClass myVar) 
    { 
     ... 

     picture = ImageFromStream(new MemoryStream(myVar.ImageStream)); 

     ... 
    } 


    .. 
} 
+0

Я думаю, что, как обертывание идеи интерфейса, это решение не очень хорошо масштабируется, если я должен иметь несколько экземпляров статических вызовов через свой код. Мне нужно было бы создать функцию для каждого статического вызова. Не существует способа измакать статические методы из класса библиотеки? – Joe

+0

Вам нужно было бы создать свойство для разных статических методов, поскольку вы могли бы повторно использовать их. Я считаю, что TypeMock может издеваться над статическими методами, используя некоторое переплетение IL, но оно не является бесплатным. Исключающий код, подлежащий тестированию, может занять довольно много работы на C#, я боюсь. – tarn

+0

После некоторых мыслей, предлагаемые интерфейсы и функциональные решения были беспорядочными, но это решение функций занимало меньше строк, чем создание нового интерфейса и класса для просто издевательства над одной статической функцией. Поэтому я пойду с этим. Спасибо за ответы на все вопросы. – Joe

3

Вы можете создать интерфейс IImageLoader. «Обычная» реализация просто вызывает Image.FromStream, в то время как тестовая версия вашего устройства может делать все, что вам нужно.

+0

Это означало бы, что я должен создать интерфейс для каждого статического вызова метода я бы сделать к различным классам. Я надеюсь, что есть более элегантный способ сделать это ... – Joe

+1

Нет, нет элегантного способа обойти это на статически скомпилированном языке без помощи во время выполнения. Есть способ сделать это, нажав на API CLR профилирования (очень сложный). Вот как работает TypeMock – CVertex

+1

Помимо решения CVertex с использованием TypeMock, на самом деле это не так. Статические методы и модульные испытания не очень хорошо сочетаются. –

2

Moq и большинство других издевательских фреймворков не поддерживают издевательства над статическими методами. Тем не менее, TypeMock действительно поддерживает издевательство статических методов, и это может вас заинтересовать, если вы захотите его купить. В противном случае вам придется реорганизовать так, чтобы интерфейс можно было насмехаться ...

+0

Роли из MSR также играют в этом пространстве –

1

Это может быть выполнено с помощью Moles, электроинструментов Visual Studio 2010. Moles код будет выглядеть следующим образом:

// replace Image.FromStream(MemoryStream) with a delegate 
MImage.FromStreamMemoryStream = stream => null;