2016-11-12 1 views
2
public partial class TestObjectCode 
{ 
    /// <summary> 
    /// We don't make constructor public and forcing to create object using 
    /// <see cref="Create"/> method. 
    /// But constructor can not be private since it's used by EntityFramework. 
    /// Thats why we did it protected. 
    /// </summary> 
    protected TestObjectCode() {} 

    public static TestObjectCode Create(
        DateTime executiontime, 
        Int32 conditionid, 
        String conditionname) 
    { 
     var @objectToReturn = new TestObjectCode 
     { 

      ExecutionTime = executiontime, 
      ConditionId = conditionid, 
      ConditionName = conditionname 
     }; 

     return @objectToReturn; 
    } 

    public virtual Int32 ConditionId { get; set; } 

    public virtual String ConditionName { get; set; } 

    public virtual DateTime ExecutionTime { get; set; } 
} 

Тест:Autofixture для Перечня объекта, который имеет защищенный конструктор и фабричный метод

[Test] 
[TestCase("1/1/2015", "07/5/2016")] 
public void Task Should_Filter_By_Date_Range_Only(string startDate, string endDate) 
{ 
    //Arrange 
    var startDateTime = DateTime.Parse(startDate); 
    var endDateTime = DateTime.Parse(endDate); 

    //get randomDate between two Dates 
    TimeSpan timeSpan = endDateTime - startDateTime; 
    var randomTest = new Random(); 
    TimeSpan newSpan = new TimeSpan(0, randomTest.Next(0, (int)timeSpan.TotalMinutes), 0); 
    DateTime newDate = startDateTime + newSpan; 

    var list = new List<TestObjectCode>(); 
    _fixture.AddManyTo(list); 
    _fixture.Customize<TestObjectCode>(
     c => c 
     .With(x => x.ExecutionTime, newDate) 
     .With(x => x.ConditionId, 1) 
     ); 
    _fixture.RepeatCount = 7; 
    _fixture.AddManyTo(list); 
} 

Выше испытания не удается из-_fixture.Customize и моей CTOR быть proetced. если я сделаю его общедоступным, это сработает, но я бы хотел, чтобы это было сделано. этот класс имеет еще 15 свойств, которые я не перечислял здесь. также мне нужна дата randmon между двумя dateRanges для каждого элемента в списке.

Как я могу назвать заводский метод создания? мне нужно определить autoFixure для каждого свойства?

Ploeh.AutoFixture.ObjectCreationException: Украшенные ISpecimenBuilder не может создать экземпляр на основе запроса: EMR.Entities.AbpAuditLogs. Это может произойти, если запрос представляет собой интерфейс или абстрактный класс; если это так, зарегистрируйте ISpecimenBuilder, который может создавать образцы на основе запроса. Если это происходит в строго типизированном выражении Build, попробуйте поставить фабрику, используя один из методов IFactoryComposer.

ответ

2

Вы можете сделать вышеупомянутый тест пройти путем добавления .FromFactory(new MethodInvoker(new FactoryMethodQuery())) к вашей настройке:

fixture.Customize<TestObjectCode>(
    c => c 
    .FromFactory(new MethodInvoker(new FactoryMethodQuery())) 
    .With(x => x.ExecutionTime, newDate) 
    .With(x => x.ConditionId, 1)); 

Оба этих классы определены в Ploeh.AutoFixture.Kernel пространства имен.

Все, что сказал, однако, вы должны strongly reconsider your overall approach.

+0

, который работает, но только первый объект в списке следует правилам настройки для _fixture.AddManyTo (list); остальная часть предметов случайна –