2015-08-27 3 views
1

Я использую фрейм Moq для насмешек. Я нашел проблему с переопределением Equals, которая не работает должным образом. Кажется, что в динамическом объекте должно быть переопределение, которое всегда возвращает false. Вот пример кода. Я использую версию Moq 4.2.1507.0118 от nuget.Сравнение Moq не соответствует

public class B 
{ 
    public override bool Equals(object obj) 
    { 
     return base.Equals(obj); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var a = new Moq.Mock<B>().Object; 
     var b = a; 
     bool equalsOperator = a == b; //returns true 
     bool referenceEquals = object.ReferenceEquals(a, b); //returns true 
     bool equals_b = a.Equals(b); //returns false 
     bool equals_a = a.Equals(a); //returns false 
    } 
} 

Другое интересное, если точка останова находится на переопределении Equals, она никогда не попадает. Есть ли ошибка в структуре Moq, или есть что-то, что я делаю неправильно?

ответ

5

Чтобы исправить это, вы должны установить свойство moq CallBase равным true, чтобы убедиться, что вы вызываете базовую реализацию или ее переопределенный метод.

var a = new Moq.Mock<B>().Object; 

Изменить это

var a = new Moq.Mock<B>() { CallBase = true }.Object; 

Из Moq Quickstart (курсив добавлен):

сделать макет ведут себя как "истинный Мок", поднимая исключения для всего, что не имеет соответствующее ожидание: в Moq сленг «Строгий» макет; поведения по умолчанию является «Loose» издеваться, который никогда не бросает и значение возвращается по умолчанию или пустые массивы, перечислимые и т.д., если нет ожидания не устанавливаются для члена

Таким образом, вы получаете false, то default value для bool.

+2

Приобретено. Если вы хотите «базу вызовов» только для этого члена, вы можете использовать 'm.Setup (x => x.Equals (It.IsAny ())). CallBase();' где 'm' - ваш макет (до вы делаете '.Object'). Конечно, вы можете использовать '.Returns (...)' вместо '.CallBase()', если вы хотите «обмануть» метод вместо вызова базовой реализации. –

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