2013-03-11 3 views
3

Я использую AutoFixture с AutoMoq. Я пытаюсь создать поддельный экземпляр класса, который имеет свойство с геттером, но без сеттера. Я ожидаю, что AutoFixture настроит макет, чтобы он вернул заданное значение, даже если нет настроителя.AutoFixture.AutoMoq: заданное значение только для чтения свойства

Мой код-то вроде этого:

var data = new List<Data>() { new Data() }; 
var userManager = fixture.Build<IRepository>() 
     //.With(x => x.Data, data) 
     .CreateAnonymous(); 
Mock.Get(userManager).Setup(x => x.Data).Returns(data); 

К сожалению, «С» метод не работает в этом случае, так как автоматическое приспособление говорит, что данные не имеют какой-либо сеттер, какой, почему я должен установить значение затем с прямым призывом к макету.

Есть ли способ, которым автоматическое устройство может сделать это самостоятельно, поэтому мне не нужна последняя строка кода?

Редактировать: Я допустил ошибку, пример кода не работает. Это должно быть

var data = new List<Data>() { new Data() }; 
var userManager = fixture.CreateAnonymous<IRepository>(); 
Mock.Get(userManager).Setup(x => x.Data).Returns(data) 

Тем не менее, было бы хорошо, если бы был метод с поддельным экземпляром.

+0

В некоторых случаях вы можете захотеть «SetupGet» Moq, а не «Setup» (но это не проблема). FWIW Я уверен, что созданный AF материал не имеет отношения к тому, что вы ищете (что, по-видимому, меньше устанавливает состояние и больше может вымываться/подставлять сторону чтения). Можете ли вы подтвердить, что не имеете дело с объектами, у которых есть четкий способ вставить состояние (например, через ctor params?) –

+0

Связанные: http://stackoverflow.com/questions/12963019/how-do-i-get-autofixture -automoq-to-return-results-from-injected-services-in-a –

ответ

2

AutoFixture.AutoMoq doesn't set up your Test Doubles для вас.

Если вы не хотите указывать настройку для IRepository.Data в каждом тестовом случае, вы можете упаковать установку в Customization.

public class RepositoryCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Register(() => 
     { 
      var td = new Mock<IRepository>(); 
      td.SetupGet(r => r.Data).Returns(fixture.CreateMany<Data>()); 
      return td.Object; 
     }); 
    } 
} 

При том, что следующий тест пройден:

[Fact] 
public void AutoProperty() 
{ 
    var fixture = new Fixture().Customize(new RepositoryCustomization()); 
    var repo = fixture.Create<IRepository>(); 
    Assert.NotEmpty(repo.Data); 
} 

В теории можно было бы написать автоматизированный код, который отражает более членов интерфейса и устанавливает возвращаемое значение для каждого члена, но IMO, это никогда не должно быть по умолчанию для AutoFixture.AutoMoq.

+0

На самом деле, я хотел бы улучшить метод «С». Но это не проблема, если это невозможно. Спасибо за ваш ответ. –

+0

В каком направлении вы хотели бы улучшить метод 'With'. Что у него отсутствует? –

+1

@MarkSeemann Я считаю, что он говорит, что по умолчанию это нормально, но желательно, было бы что-то похожее на '.With (x => x.Data, data)', которое могло бы действовать так, как если бы оно было присвоено этому конкретному свойству, которое не имеет сеттера (при использовании AutoMoq). –