2016-03-28 2 views
1

Я не могу понять, как заставить Moq настроить метод .Equals на объекты. Следующее утверждение не удается:Moq - Setup .Equals метод для возврата false

var Song = new Mock<ISong>(); 
Song.Setup(x => x.Equals(Song.Object)) 
    .Returns(false); 

Assert.IsFalse(Song.Object.Equals(Song.Object)); 

Другими словами, Song.Object.Equals(Song.Object) всегда возвращает истину.

Возможно ли издеваться над методом .Equals с помощью Moq? Что мне не хватает?

+0

Вы выполняете установку для Song.Equals, а не Song.Object.Equals. Если вы протестируете Song.Equals (Song.Object), он должен вернуть false ... –

+0

Ну, подождите, что? Я написал все свои тесты, используя Mock.Object как фактический макет. И он работал для всех других 30+ тестов. Зачем это терпеть неудачу для этого? EDIT: это действительно то, что они показывают в начале своей статьи: https://github.com/moq/moq4 – aspyct

+0

Извините, что вы правы. Я сделал то же самое, что и вы, и получил тот же результат. Если я добавлю «bool Equals (object obj)» в мой интерфейс ISong, тогда он работает ... что имеет смысл для меня ... Я могу разработать ответ, если вы хотите, чтобы я это сделал. –

ответ

2

Это ограничение Castle.Core (используется внутренне Moq и другими насмешливыми фреймворками, такими как NSubstitute). Он не может переопределять виртуальные методы, определенные на System.Object, то есть ToString, Equals и GetHashCode.

Обходной путь заключается в том, чтобы вручную переопределить эти методы где-нибудь в дереве наследования.

Например, это будет терпеть неудачу:

public class Class {} 

var m = Mock.Of<Class>(c => 
    c.Equals(It.IsAny<object>()) == true 
    ); 

Assert.True(m.Equals(null)); 

Но это пройдет:

public class Class 
{ 
    public override bool Equals(object o) => base.Equals(o); 
} 

var m = Mock.Of<Class>(c => 
    c.Equals(It.IsAny<object>()) == true 
    ); 

Assert.True(m.Equals(null)); 

Поскольку вы используете интерфейс, вы можете просто объявить метод на нем: bool Equals(object o);

+0

Это исправлено. Блестящий :) – aspyct

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