2016-03-25 3 views
2

Я не могу показать moq свой класс, который имеет методы getter и setter (а не свойства). Мне нужно сохранить переменную где-нибудь, чтобы вернуть ее позже.Как moq класс с методами Get() и Set()

Подпись моего класса:

public interface IMyClass 
{ 
    int Get(); 
    void Set(int i); 
} 

Моя реальная реализация:

  • Set() => Шифрует Int и сохраняет его в локальной переменной
  • Get() => Расшифровывает int от локальной переменной и возвращает int

Как я хочу, чтобы moq вел себя:

public class MyClassFake : IMyClass 
{ 
    private int _local; 
    public int Get() 
    { 
     return _local; 
    } 

    public void Set(int i) 
    { 
     _local = i; 
    } 
} 

То, что я пытался и не работал до сих пор:

 var mockMyClass = new Mock<IMyClass>(); 
     var number = new int(); 
     mockMyClass.Setup(x => x.Set(It.IsAny<int>())).Callback<int>(x=> number = x); 
     mockMyClass.Setup(x => x.Get()).Returns(number); 

ответ

1

Вы должны изменить настройки Get() использовать перегрузку, которая принимает в качестве параметра Func<>:

var mockMyClass = new Mock<IMyClass>(); 
var number = 0; 
mockMyClass.Setup(x => x.Set(It.IsAny<int>())).Callback<int>(x => number = x); 
mockMyClass.Setup(x => x.Get()).Returns(() => number); 

В вашем текущем коде вы определяете результат Get() как фиксированное число (начальное значение number)

+0

Благодарим за быстрый ответ. Я googled это, но, к сожалению, я все еще не уверен, как перегрузить мой метод Get(), который получает параметр Func <>. Вы могли бы привести пример? –

+1

@ U.Bulle: Извините, я имею в виду 'Returns()' call: 'Returns (() => number);' –

+0

Мне было немного страшно перегружать реальный класс, но это было даже не нужно и '() =>' сделал трюк. Приятного уик-энда Артуро, ура! :) –

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