Moq не вызывает абстрактные методы - PullRequest
0 голосов
/ 14 декабря 2018

В моем приложении есть некоторый код, который использует шаблон абстрактной фабрики: абстрактный класс, имеющий абстрактную зависимость.Конкретная зависимость должна доставляться конкретным классом прямо в конструктор абстрактного класса.Однако, когда я хочу издеваться над конкретным классом, Moq никогда не вызывает конкретную реализацию.Код ниже:

using Moq;
using Xunit;

namespace Example
{
    public abstract class AbstractClass
    {
        public AbstractDependency Dependency { get; private set; }

        protected AbstractClass()
        {
            // This constructor is called by Moq
            Dependency = CreateDependency();    
        }

        protected abstract AbstractDependency CreateDependency();
    }

    public class ConcreteClass : AbstractClass
    {
        // Problem: This method is not called by Moq
        protected override AbstractDependency CreateDependency()
        {
            return new ConcreteDependency();
        }
    }

    public abstract class AbstractDependency
    {
    }

    public class ConcreteDependency : AbstractDependency
    {
    }

    public class Tests
    {
        [Fact]
        public void Test1()
        {
            // The following passes. The concrete implementation of CreateDependency is called!
            ConcreteClass concreteClass = new ConcreteClass();
            Assert.NotNull(concreteClass.Dependency);

            // The following fails. When code is run with the mock the concrete implementation of CreateDependency is not called!
            Mock<ConcreteClass> concreteClassMock = new Mock<ConcreteClass>();
            Assert.NotNull(concreteClassMock.Object.Dependency);
        }
    }
}

Почему это так?Я думаю, что Moq должен быть в состоянии разрешить конкретный класс и создать его экземпляр.И как я могу это исправить, не меняя производственный код?

...