How to use AutoFixture in this case?

旧时模样 提交于 2019-12-07 22:53:54

问题


I have the following code:

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);

and that passes the test.

Then I tried using AutoFixture as follows:

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);

which fails. In particular, the patientRecord in the second instance is not getting populated properly.

What am I doing wrong here?


回答1:


Note: I couldn't compile the test you provided.. however it seems that all you have to do is:

fixture.Inject(mockRepositoryFactory);

You may try the following:

[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 inject the IRepositoryFactory so that the same, injected, instance will be passed in the SUT.


Alternatively, you can also use AutoFixture declaratively with the 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
} 

The AutoDomainDataAttribute is defined as:

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


来源:https://stackoverflow.com/questions/16612145/how-to-use-autofixture-in-this-case

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!