В моем приложении есть некоторый код, который использует шаблон абстрактной фабрики: абстрактный класс, имеющий абстрактную зависимость.Конкретная зависимость должна доставляться конкретным классом прямо в конструктор абстрактного класса.Однако, когда я хочу издеваться над конкретным классом, 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 должен быть в состоянии разрешить конкретный класс и создать его экземпляр.И как я могу это исправить, не меняя производственный код?