Конструкторы RSPEC-1699 должны вызывать только неперезаписываемые методы. Не имеет ничего с модульными тестами, оно останется там независимо от того, как вы собираетесь его тестировать.
Кто-нибудь знает о лучшей реализации?
Я хотел бы предложить другой подход, чтобы избежать этого нарушения и сделать ваш код еще более тестируемым.
Идея состоит в том, чтобы вместо base
использовать класс композиции и принцип DI.
public interface IAreaContext
{
Area[] GetAreas();
}
public class AreaRepository
{
private IAreaContext _areaContext;
protected BaseAreaRepository(IAreaContext areaContext)
{
_areaContext = areaContext;
}
public Area[] GetAll()
{
return _areaContext.GetAreas();
}
}
Тогда вы можете определить несколько реализаций IAreaContext
и injext:
public class MyAreaContext : IAreaContext
{
public Area[] GetAreas()
{
return //Load data from an other source
}
}
public class MyOtherAreaContext : IAreaContext
{
public Area[] GetAreas()
{
return //Load data from an other source
}
}
Теперь, когда у вас есть этот установочный репозиторий, можно легко тестировать различные варианты поведения самого контекста.Это просто пример для демонстрации идеи:
//Arrange
var context = new Mock<IAreaContext>();
context.Setup(m => m.GetAreas()).Verifiable();
var sut = new AreaRepository(context.Object);
//Act
var _ = sut.GetAll();
//Assert
context.Verify();