2016-10-26 10 views
0

Я пытаюсь использовать NSubstitution в моей программе тестирования модулей C#.NSubstitution для методов в C#?

Я пытаюсь сделать замену методом, называемым внутри mehtod. вот пример:

public class operation 
{ 
    public int addition(int a, int b) 
    { 
    return (a + b); 
    } 
} 

public class anotherClass 
{ 
    public int increment(int ax, int bx) 
    { 
    operation loc = new operation(); 
    ax = loc.addition(ax,bx); 
    return (ax + 1); 
    } 
} 

Можно ли вызвать метод приращения() в моей основной функции и применить замену к методу сложения()?

Я хочу заставить возвращаемое значение в методе добавления() при вызове метода increment(). например заставить экксим-бросок.

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

+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные детали, чтобы выделить именно то, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу «Как спросить», чтобы помочь прояснить этот вопрос. – mybirthname

+0

Я добавил больше ясности к цели. @mybirthname –

+0

NSubstitute всегда возвращает новый объект, где вы можете переопределить методы (при условии, что вы заменяете интерфейс или класс виртуальными методами), он не изменяет существующие объекты или «обычные» объекты .NET. Поскольку вы строите новую «операцию» внутри рассматриваемого метода, вы не можете изменить этот новый объект, вы должны сначала попросить NSubstitute создать его вариант замены, тогда вы должны дать это методу и использовать этот новый объект вместо того, чтобы создавать его собственный. –

ответ

0

Поскольку вы создаете новый экземпляр operation внутри метода, который вы тестируете (increment), нет никакого способа, чтобы получить NSubstitut проксировать ваш звонок addition - вы лучше (по многим причинам, одна из которых является проверяемость) с помощью Inversion of control, чтобы иметь возможность заменить вашу функциональность:

public interface IOperation 
{ 
    int addition(int a, int b); 
} 

public class operation : IOperation 
{ 
    public int addition(int a, int b) 
    { 
    return (a + b); 
    } 
} 

public class anotherClass 
{ 
    private readonly IOperation _operation; 
    public anotherClass(IOperation operation) 
    { 
     _operation = operation; 
    } 

    public int increment(int ax, int bx) 
    {   
    ax = _operation.addition(ax,bx); 
    return (ax + 1); 
    } 
} 

Таким образом, вы можете передать экземпляр вашего operation класса anotherClass при запуске приложения, и передать в своих модульных тестов в NSubstitute.Substitute.For<IOperation>(). Вы можете использовать этот макет, чтобы получить его, чтобы вернуть все, что вы хотите:

var mockOperation = NSubstitute.Substitute.For<IOperation>(); 
mockOperation.addition(Arg.Any<int>(), Arg.Any<int>()).Return(/*...*/); 
+0

Итак, если я не могу изменить код (добавить интерфейс), который я тестирую, то это невозможно сделать? –

+0

@AngeloCharl Я не могу придумать, как это сделать, не меняя код - если классы находятся в разных сборках, тогда вы можете попробовать выполнить «операцию» и ссылаться на него вместо исходной сборки, но даже это звучит слишком грязный тбх – KMoussa

0

Для этого нужно перейти к anotherClass зависимости к операции класса. Вы можете сделать это по-разному, один из них вводит его с помощью конструктора, но, во-первых, вам нужно добавить интерфейс IOperation, чтобы он мог издеваться над ним с помощью NSubstitute. Пример кода может выглядеть следующим образом:

public interface Ioperation 
     { 
      int addition(int a, int b); 
     } 

     public class operation : Ioperation 
     { 
      public int addition(int a, int b) 
      { 
       return (a + b); 
      } 
     } 

     public class anotherClass 
     { 

      Ioperation _operation; 
      public anotherClass(Ioperation operation) 
      { 
       _operation = operation; 
      } 

      public int increment(int ax, int bx) 
      { 
       operation loc = new operation(); 
       ax = loc.addition(ax, bx); 
       return (ax + 1); 
      } 
     } 

Тогда вы можете издеваться над его NSubstitute в следующим образом:

operation.addition(Arg.Any<int>(), Arg.Any<int>()).Throws(new Exception()); 

и передать его через конструктор

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

  • Нет связанных вопросов^_^