Как смоделировать объект, который расширяет класс и реализует интерфейс? - PullRequest
4 голосов
/ 20 декабря 2011

У меня есть этот класс:

public class BaseFoo
{
    public bool BoolProp { get; set; }
}

public interface IFoo {
    void Method();
}

public class FooClass : BaseFoo, IFoo
{
    public void Method()
    {
        // DoSomething
    }
}

public class MyClass
{
    IFoo foo; // 
    public MyClass(IFoo foo)
    {
        this.foo = foo;
    }

    public void DoSomething()
    {
        if (((FooClass)foo).BoolProp)
        {
            // yeah
        }
        else
        {
            //bad
        }
    }
}

Мой сценарий:

    void main()
    {
        MyClass obj = new MyClass(new FooClass());
        obj.DoSomething();
    } 

Я бы хотел создать фиктивный объект для интерфейса IFoo, который бы позволял мне также имитировать класс BaseFoo, потому что мне всегда нужно избегать запуска ветви "else" if (((FooClass) foo) .BoolProp ) "в методе MyClass.DoSomething ().
Итак, как я могу создать фиктивный объект, который позволяет мне имитировать поведение BaseFoo.BoolProp, используемого в MyClass (который будет принимать фиктивный объект IFoo)?
Я сделал это без какого-либо результата, потому что BoolProp не является виртуальным, и я не могу изменить его, поскольку он является частью класса .NET Framework:

  var cMock = new Mock<BaseFoo>();
  var iMock = cMock.As<IFoo>();

  cMock.Setup(c => c.BaseProp).Returns(true);
  MyClass myClass = new MyClass(iMock.Object);

Ответы [ 2 ]

5 голосов
/ 20 декабря 2011

На самом деле ваш дизайн говорит о том, что ваш класс MyClass не имеет зависимости от IFoo, он имеет зависимость от экземпляра класса, полученного из BaseFoo и , реализующего IFoo,В этом случае, вероятно, лучше всего ввести объединяющий интерфейс, который затем можно использовать как зависимость и макет:

interface IFooBar
{
  bool BoolProp { get; set; }
  void Method();
}  
0 голосов
/ 20 декабря 2011

Как насчет объявления абстрактного класса (BaseFooFoo?), Который наследуется от BaseFoo и реализует IFoo.Тогда вы можете показать BaseFooFoo moq.

...