2013-05-17 3 views
1

У меня есть следующий код:Как использовать AutoFixture в этом случае?

var boundArgument = new BoundArgumentOption 
{ 
    PatientId = patientId 
}; 

var mockRepositoryFactory = A.Fake<IRepositoryFactory>(); 

var sut = new HtmlOutputBuilder(mockRepositoryFactory); 

var patientRecord = // Some record; 

var mockRepository = A.Fake<IRepository>(); 
A.CallTo(() => mockRepository.Get(boundArgument)).Returns(patientRecord); 
A.CallTo(() => mockRepositoryFactory.Create(boundArgument)).Returns(mockRepository); 

string actualResult = sut.BuildReport(boundArgument); 

actualResult.Should().Be(expectedHtmlContent); 

и проходит тест.

Затем я попытался с помощью AutoFixture следующим образом:

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

var boundArgument = fixture.Create<BoundArgumentOption>(); 

var mockRepositoryFactory = A.Fake<IRepositoryFactory>(); 

fixture.Freeze(mockRepositoryFactory); 

var sut = fixture.Create<HtmlOutputBuilder>(); 

var patientRecord = //Some record; 

boundArgument.PatientId = patientId; 

var mockRepository = A.Fake<IRepository>(); 
A.CallTo(() => mockRepository.Get(boundArgument)).Returns(patientRecord); 

A.CallTo(() => mockRepositoryFactory.Create(boundArgument)).Returns(mockRepository); 

string actualResult = sut.BuildReport(boundArgument); 

actualResult.Should().Be(expectedHtmlContent); 

который терпит неудачу. В частности, во втором случае patientRecord не заполняется должным образом.

Что я здесь делаю неправильно?

+0

Какое значение 'expectedHtmlContent' ? –

+0

@NikosBaxevanis Не должно иметь значения, что значение 'expectedHmtlContent' - это только FYI, это фактически строка Html, которую я напишу в файл. – DavidS

ответ

3

Примечание: Я не мог скомпилировать тест вы предоставили .. однако кажется, что все, что вам нужно сделать, это:

fixture.Inject(mockRepositoryFactory); 

Вы можете попробовать следующее:

[Fact] 
public void TestWithAutoFixtureImperatively() 
{ 
    // Fixture setup 
    var fixture = new Fixture() 
     .Customize(new AutoFakeItEasyCustomization()); 

    var expectedRecord = fixture.Create<string>(); 
    var boundArgOption = fixture.Create<BoundArgumentOption>(); 

    var repositoryStub = A.Fake<IRepository>(); 
    A.CallTo(() => 
     repositoryStub 
      .Get(boundArgOption)) 
      .Returns(expectedRecord); 

    var repositoryFactoryStub = A.Fake<IRepositoryFactory>(); 
    A.CallTo(() => 
     repositoryFactoryStub 
      .Create(boundArgOption)) 
      .Returns(repositoryStub); 

    fixture.Inject(repositoryFactoryStub); 

    var sut = fixture.Create<HtmlOutputBuilder>(); 

    // Exercise system 
    string result = sut.BuildReport(boundArgOption); 

    // Verify outcome 
    result.Should().Be(expectedRecord); 

    // Teardown 
} 

We введитеIRepositoryFactory, чтобы тот же, инжектированный экземпляр передавался в SUT.


В качестве альтернативы, вы можете также использовать AutoFixture declaratively с xUnit.NET extension:

[Theory, AutoDomainData] 
public void TestWithAutoFixtureDeclaratively(
    string expectedRecord, 
    BoundArgumentOption boundArgOption, 
    Fake<IRepository> repositoryStub, 
    [Frozen]Fake<IRepositoryFactory> repositoryFactoryStub, 
    HtmlOutputBuilder sut) 
{ 
    // Fixture setup 
    A.CallTo(() => 
     repositoryStub 
      .FakedObject 
      .Get(boundArgOption)) 
      .Returns(expectedRecord); 

    A.CallTo(() => 
     repositoryFactoryStub 
      .FakedObject 
      .Create(boundArgOption)) 
      .Returns(repositoryStub.FakedObject); 

    // Exercise system 
    string result = sut.BuildReport(boundArgOption); 

    // Verify outcome 
    result.Should().Be(expectedRecord); 

    // Teardown 
} 

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

internal class AutoDomainDataAttribute : CompositeDataAttribute 
{ 
    internal AutoDomainDataAttribute() 
     : base(
      new AutoDataAttribute(
       new Fixture().Customize(
        new AutoFakeItEasyCustomization()))) 
    { 
    } 
} 
+0

Код не предназначен для компиляции :). Я хотел избавиться от пуха. Сказав, что предоставленный код работал :). Большое спасибо. Я не видел, чтобы метод Inject подробно описывался где угодно. Где-то где я могу найти больше информации об этом? Также в чем разница между Inject и Freeze? Должен ли это быть отдельный вопрос? – DavidS

+2

Добро пожаловать! 'Inject' настраивает экземпляр' Fixture', чтобы всегда возвращать то же самое, впрыснутое, значение. 'Freeze' создаст для вас значение, а затем внутренне вызовет' Inject'. –

+0

Подробная информация о том, как работает «Inject», можно найти на странице https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixture/FixtureRegistrar.cs#L10-75 –

Смежные вопросы