Пересмешивающие интерфейсы, у которых есть 'новые' участники с Moq - PullRequest
2 голосов
/ 02 марта 2011

У меня проблемы с подделкой набора интерфейсов:

interface IFoo
{
    object Blah { get; }
}

interface IBar : IFoo
{
    new string Blah { get; }
}

Я пробовал насмехаться как:

var mock = new Mock<IFoo>();
mock.SetupGet(m => m.Blah).Returns("Blah");

Теперь это работает:

Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));

Проблема заключается в том, что когда я добавляю следующее, чтобы также иметь значение для интерфейса IBar, значение IFoo.Blah равно нулю.

var bar = mock.As<IBar>();
bar.SetupGet(m => m.Blah).Returns("Blah");

Теперь это работает:

Assert.That(((IBar)mock.Object).Blah, Is.EqualTo("Blah"));

Но старый выходит из строя:

Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));
// mock.Object.Blah is null now

Есть ли способ заставить обоих работать?

Ответы [ 2 ]

1 голос
/ 02 марта 2011

С MOQ (v4.0.10827) и .Net 4 этот код работает:

var mock = new Mock<IFoo>();
var bar = mock.As<IBar>();
mock.SetupGet(m => m.Blah).Returns("Blah");
Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));
bar.SetupGet(m => m.Blah).Returns("BlahBlah");
Assert.That(((IBar)mock.Object).Blah, Is.EqualTo("BlahBlah"));
Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));

Вы должны инициализировать интерфейс перед настройкой своего свойства.

0 голосов
/ 02 марта 2011

Я думаю, вам нужно использовать "переопределить" вместо "нового"Когда вы используете «новый», вы фактически делаете вторую функцию.Вот документация: http://msdn.microsoft.com/en-us/library/ms173153.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...