Пример использования AutoFixture с NSubstitute

Я использую NSubstitute много. И мне это нравится.

Я просто смотрю в AutoFixture. Кажется здоровым!

Я видел AutoFixture для NSubstitute и увидел несколько примеров в Moq о том, как использовать эту функцию.

Но я не могу перевести его в NSubstitute.

Я пробовал это:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());  
var addDest = Substitute.For<IPerson>();

Использование:

public interface IPersonEntity
{    
   int ID { get; set; }
   string FirstName { get; set;}
   string LastName { get; set;}
   DateTime DateOfBirth { get; set; }
   char Gender { get; set; }    
}

И я получаю объект, но ни одно из свойств не заполняется (например, точка AutoFixture).

Я также пробовал:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());
var result = fixture.Create<IPersonEntity>();

Это также дало мне объект без населенных свойств. (Обратите внимание, что если я делаю выше с классом PersonEntity, тогда все свойства заполняются.)

Я уверен, что есть способ сделать эту работу, но я не могу ее найти.

Итак, учитывая мой интерфейс IPersonEntity выше, кто-нибудь знает, как использовать AutoFixture и NSubstitute, чтобы дать мне заполненный объект IPersonEntity?

Ответ 1

Вместо настройки экземпляра Fixture с помощью AutoNSubstituteCustomization вы можете использовать настройку ниже:

var fixture = new Fixture().Customize(
    new AutoPopulatedNSubstitutePropertiesCustomization());

var result = fixture.Create<IPersonEntity>();
// -> All properties should be populated now.

AutoPopulatedNSubstitutePropertiesCustomization определяется как:

internal class AutoPopulatedNSubstitutePropertiesCustomization
    : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.ResidueCollectors.Add(
            new Postprocessor(
                new NSubstituteBuilder(
                    new MethodInvoker(
                        new NSubstituteMethodQuery())),
                new AutoPropertiesCommand(
                    new PropertiesOnlySpecification())));
    }

    private class PropertiesOnlySpecification : IRequestSpecification
    {
        public bool IsSatisfiedBy(object request)
        {
            return request is PropertyInfo;
        }
    }
}

Разница с AutoNSubstituteCustomization заключается в том, что вышеупомянутая настройка также украшена экземпляром Postprocessor для автоматического задания значений для всех общедоступные свойства запрашиваемого типа.

Ссылки

Вышеупомянутое решение основано на следующих статьях блога Mark Seemann: