Свойства макета базового интерфейса не работают через макет производного интерфейса - PullRequest
1 голос
/ 28 мая 2019

У меня есть эти интерфейсы:

public interface IBase
{
    int Value { get; }
}

public interface IDerived : IBase
{
    new int Value { get; set; }
}

Следующий тест работает правильно:

var mock = new Mock<IDerived>( MockBehavior.Strict );
mock.SetupGet( m => m.Value ).Returns( 0 );

IDerived o = mock.Object;

Assert.That( o.Value, Is.EqualTo( 0 ) );

Однако, когда я меняю тип o на IBase, я получаюследующая ошибка:

Message: Moq.MockException : IBase.Value invocation failed with mock behavior Strict.
All invocations on the mock must have a corresponding setup.

Это дизайн?Нужно ли удалять флаг Strict, чтобы получить доступ к свойству базового интерфейса (которое скрыто производным интерфейсом)?Или есть какой-то другой тип установки, который я мог бы использовать?

В качестве примечания, была проблема , связанная с базовыми / производными свойствами только для чтения / чтения-записи, нозаявленный тип макета объекта там не рассматривался.Может ли это быть другой проблемой в Moq?

1 Ответ

2 голосов
/ 29 мая 2019

Свойство Value интерфейса IBase и интерфейса IDerived не совпадают. Например, вы можете сделать это:

public interface IBase
{
    string Value { get; }
}

public interface IDerived : IBase
{
    new string Value { get; }
}

public class Implementation : IDerived
{
    string IBase.Value { get; } = "Base";

    string IDerived.Value { get; } = "Derived";
}

Чтобы правильно смоделировать интерфейс IDerived, вы должны установить возвращаемое значение для обоих свойств. Метод Mock.As полезен для приведения интерфейса IDerived к IBase.

Mock<IDerived> mock = new Mock<IDerived>( MockBehavior.Strict );
mock.Setup( obj => obj.Value ).Returns( "Derived" );
mock.As<IBase>().Setup( obj => obj.Value ).Returns( "Base" );
...